From 8487716e8567676f2ecb0f9641fddc3361969b88 Mon Sep 17 00:00:00 2001 From: Soham Zemse <22412996+zemse@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:27:57 +0000 Subject: [PATCH] add contract deployments --- package.json | 1 + src/contracts/deployments/arbsep/.chainId | 1 + .../deployments/arbsep/Hash2Verifier.json | 148 ++++ .../deployments/arbsep/NoteVerifier.json | 148 ++++ src/contracts/deployments/arbsep/Pool.json | 639 ++++++++++++++++++ .../arbsep/SplitJoin16Verifier.json | 148 ++++ .../arbsep/SplitJoin32Verifier.json | 148 ++++ src/contracts/deployments/arbsep/USDC.json | 530 +++++++++++++++ .../823b9fd0ce32197968842b1b9c0002f2.json | 93 +++ src/contracts/deployments/sepolia/.chainId | 1 + .../deployments/sepolia/Hash2Verifier.json | 148 ++++ .../deployments/sepolia/NoteVerifier.json | 148 ++++ src/contracts/deployments/sepolia/Pool.json | 639 ++++++++++++++++++ .../sepolia/SplitJoin16Verifier.json | 148 ++++ .../sepolia/SplitJoin32Verifier.json | 148 ++++ src/contracts/deployments/sepolia/USDC.json | 530 +++++++++++++++ .../823b9fd0ce32197968842b1b9c0002f2.json | 93 +++ src/contracts/index.ts | 35 + .../@openzeppelin/contracts/index.ts | 9 + .../draft-IERC6093.sol/IERC1155Errors.ts | 69 ++ .../draft-IERC6093.sol/IERC20Errors.ts | 69 ++ .../draft-IERC6093.sol/IERC721Errors.ts | 69 ++ .../interfaces/draft-IERC6093.sol/index.ts | 6 + .../contracts/interfaces/index.ts | 5 + .../contracts/token/ERC20/ERC20.ts | 286 ++++++++ .../contracts/token/ERC20/IERC20.ts | 262 +++++++ .../token/ERC20/extensions/IERC20Metadata.ts | 286 ++++++++ .../contracts/token/ERC20/extensions/index.ts | 4 + .../contracts/token/ERC20/index.ts | 7 + .../@openzeppelin/contracts/token/index.ts | 5 + .../@openzeppelin/contracts/utils/Create2.ts | 69 ++ .../@openzeppelin/contracts/utils/index.ts | 4 + .../typechain-types/@openzeppelin/index.ts | 5 + .../bin/hash_2/contract/hash_2/index.ts | 5 + .../hash_2/plonk_vk.sol/BaseUltraVerifier.ts | 110 +++ .../hash_2/plonk_vk.sol/UltraVerifier.ts | 110 +++ .../contract/hash_2/plonk_vk.sol/index.ts | 5 + .../circuits/bin/hash_2/contract/index.ts | 5 + .../@ultralane/circuits/bin/hash_2/index.ts | 5 + .../@ultralane/circuits/bin/index.ts | 11 + .../circuits/bin/note/contract/index.ts | 5 + .../circuits/bin/note/contract/note/index.ts | 5 + .../note/plonk_vk.sol/BaseUltraVerifier.ts | 110 +++ .../note/plonk_vk.sol/UltraVerifier.ts | 110 +++ .../note/contract/note/plonk_vk.sol/index.ts | 5 + .../@ultralane/circuits/bin/note/index.ts | 5 + .../bin/split_join_16/contract/index.ts | 5 + .../contract/split_join_16/index.ts | 5 + .../plonk_vk.sol/BaseUltraVerifier.ts | 110 +++ .../plonk_vk.sol/UltraVerifier.ts | 110 +++ .../split_join_16/plonk_vk.sol/index.ts | 5 + .../circuits/bin/split_join_16/index.ts | 5 + .../bin/split_join_32/contract/index.ts | 5 + .../contract/split_join_32/index.ts | 5 + .../plonk_vk.sol/BaseUltraVerifier.ts | 110 +++ .../plonk_vk.sol/UltraVerifier.ts | 110 +++ .../split_join_32/plonk_vk.sol/index.ts | 5 + .../circuits/bin/split_join_32/index.ts | 5 + .../@ultralane/circuits/index.ts | 5 + .../typechain-types/@ultralane/index.ts | 5 + src/contracts/typechain-types/common.ts | 131 ++++ .../typechain-types/contracts/Lock.ts | 140 ++++ .../contracts/MerkleTreeWithHistory.ts | 182 +++++ .../typechain-types/contracts/Pool.ts | 471 +++++++++++++ .../contracts/StealthAddress.ts | 127 ++++ .../typechain-types/contracts/USDC.ts | 286 ++++++++ .../contracts/Verifier.sol/Hash2Verifier.ts | 110 +++ .../contracts/Verifier.sol/NoteVerifier.ts | 110 +++ .../Verifier.sol/SplitJoin16Verifier.ts | 110 +++ .../Verifier.sol/SplitJoin32Verifier.ts | 110 +++ .../contracts/Verifier.sol/index.ts | 7 + .../typechain-types/contracts/index.ts | 11 + .../contracts/test/Poseidon2Test.ts | 139 ++++ .../typechain-types/contracts/test/index.ts | 4 + .../@openzeppelin/contracts/index.ts | 6 + .../IERC1155Errors__factory.ts | 127 ++++ .../IERC20Errors__factory.ts | 111 +++ .../IERC721Errors__factory.ts | 128 ++++ .../interfaces/draft-IERC6093.sol/index.ts | 6 + .../contracts/interfaces/index.ts | 4 + .../contracts/token/ERC20/ERC20__factory.ts | 330 +++++++++ .../contracts/token/ERC20/IERC20__factory.ts | 205 ++++++ .../extensions/IERC20Metadata__factory.ts | 247 +++++++ .../contracts/token/ERC20/extensions/index.ts | 4 + .../contracts/token/ERC20/index.ts | 6 + .../@openzeppelin/contracts/token/index.ts | 4 + .../contracts/utils/Create2__factory.ts | 90 +++ .../@openzeppelin/contracts/utils/index.ts | 4 + .../factories/@openzeppelin/index.ts | 4 + .../bin/hash_2/contract/hash_2/index.ts | 4 + .../BaseUltraVerifier__factory.ts | 118 ++++ .../plonk_vk.sol/UltraVerifier__factory.ts | 160 +++++ .../contract/hash_2/plonk_vk.sol/index.ts | 5 + .../circuits/bin/hash_2/contract/index.ts | 4 + .../@ultralane/circuits/bin/hash_2/index.ts | 4 + .../@ultralane/circuits/bin/index.ts | 7 + .../circuits/bin/note/contract/index.ts | 4 + .../circuits/bin/note/contract/note/index.ts | 4 + .../BaseUltraVerifier__factory.ts | 118 ++++ .../plonk_vk.sol/UltraVerifier__factory.ts | 160 +++++ .../note/contract/note/plonk_vk.sol/index.ts | 5 + .../@ultralane/circuits/bin/note/index.ts | 4 + .../bin/split_join_16/contract/index.ts | 4 + .../contract/split_join_16/index.ts | 4 + .../BaseUltraVerifier__factory.ts | 118 ++++ .../plonk_vk.sol/UltraVerifier__factory.ts | 160 +++++ .../split_join_16/plonk_vk.sol/index.ts | 5 + .../circuits/bin/split_join_16/index.ts | 4 + .../bin/split_join_32/contract/index.ts | 4 + .../contract/split_join_32/index.ts | 4 + .../BaseUltraVerifier__factory.ts | 118 ++++ .../plonk_vk.sol/UltraVerifier__factory.ts | 160 +++++ .../split_join_32/plonk_vk.sol/index.ts | 5 + .../circuits/bin/split_join_32/index.ts | 4 + .../factories/@ultralane/circuits/index.ts | 4 + .../factories/@ultralane/index.ts | 4 + .../factories/contracts/Lock__factory.ts | 133 ++++ .../MerkleTreeWithHistory__factory.ts | 234 +++++++ .../factories/contracts/Pool__factory.ts | 521 ++++++++++++++ .../contracts/StealthAddress__factory.ts | 152 +++++ .../factories/contracts/USDC__factory.ts | 374 ++++++++++ .../Verifier.sol/Hash2Verifier__factory.ts | 160 +++++ .../Verifier.sol/NoteVerifier__factory.ts | 160 +++++ .../SplitJoin16Verifier__factory.ts | 166 +++++ .../SplitJoin32Verifier__factory.ts | 166 +++++ .../factories/contracts/Verifier.sol/index.ts | 7 + .../factories/contracts/index.ts | 9 + .../contracts/test/Poseidon2Test__factory.ts | 158 +++++ .../factories/contracts/test/index.ts | 4 + .../typechain-types/factories/index.ts | 6 + src/contracts/typechain-types/hardhat.d.ts | 477 +++++++++++++ src/contracts/typechain-types/index.ts | 46 ++ src/index.ts | 1 + 133 files changed, 13065 insertions(+) create mode 100644 src/contracts/deployments/arbsep/.chainId create mode 100644 src/contracts/deployments/arbsep/Hash2Verifier.json create mode 100644 src/contracts/deployments/arbsep/NoteVerifier.json create mode 100644 src/contracts/deployments/arbsep/Pool.json create mode 100644 src/contracts/deployments/arbsep/SplitJoin16Verifier.json create mode 100644 src/contracts/deployments/arbsep/SplitJoin32Verifier.json create mode 100644 src/contracts/deployments/arbsep/USDC.json create mode 100644 src/contracts/deployments/arbsep/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json create mode 100644 src/contracts/deployments/sepolia/.chainId create mode 100644 src/contracts/deployments/sepolia/Hash2Verifier.json create mode 100644 src/contracts/deployments/sepolia/NoteVerifier.json create mode 100644 src/contracts/deployments/sepolia/Pool.json create mode 100644 src/contracts/deployments/sepolia/SplitJoin16Verifier.json create mode 100644 src/contracts/deployments/sepolia/SplitJoin32Verifier.json create mode 100644 src/contracts/deployments/sepolia/USDC.json create mode 100644 src/contracts/deployments/sepolia/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json create mode 100644 src/contracts/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/interfaces/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/token/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/utils/Create2.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/contracts/utils/index.ts create mode 100644 src/contracts/typechain-types/@openzeppelin/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/note/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/circuits/index.ts create mode 100644 src/contracts/typechain-types/@ultralane/index.ts create mode 100644 src/contracts/typechain-types/common.ts create mode 100644 src/contracts/typechain-types/contracts/Lock.ts create mode 100644 src/contracts/typechain-types/contracts/MerkleTreeWithHistory.ts create mode 100644 src/contracts/typechain-types/contracts/Pool.ts create mode 100644 src/contracts/typechain-types/contracts/StealthAddress.ts create mode 100644 src/contracts/typechain-types/contracts/USDC.ts create mode 100644 src/contracts/typechain-types/contracts/Verifier.sol/Hash2Verifier.ts create mode 100644 src/contracts/typechain-types/contracts/Verifier.sol/NoteVerifier.ts create mode 100644 src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin16Verifier.ts create mode 100644 src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin32Verifier.ts create mode 100644 src/contracts/typechain-types/contracts/Verifier.sol/index.ts create mode 100644 src/contracts/typechain-types/contracts/index.ts create mode 100644 src/contracts/typechain-types/contracts/test/Poseidon2Test.ts create mode 100644 src/contracts/typechain-types/contracts/test/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/token/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/Create2__factory.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/index.ts create mode 100644 src/contracts/typechain-types/factories/@openzeppelin/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/circuits/index.ts create mode 100644 src/contracts/typechain-types/factories/@ultralane/index.ts create mode 100644 src/contracts/typechain-types/factories/contracts/Lock__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/MerkleTreeWithHistory__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/Pool__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/StealthAddress__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/USDC__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/Verifier.sol/Hash2Verifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/Verifier.sol/NoteVerifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin16Verifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin32Verifier__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/Verifier.sol/index.ts create mode 100644 src/contracts/typechain-types/factories/contracts/index.ts create mode 100644 src/contracts/typechain-types/factories/contracts/test/Poseidon2Test__factory.ts create mode 100644 src/contracts/typechain-types/factories/contracts/test/index.ts create mode 100644 src/contracts/typechain-types/factories/index.ts create mode 100644 src/contracts/typechain-types/hardhat.d.ts create mode 100644 src/contracts/typechain-types/index.ts diff --git a/package.json b/package.json index 3dbf99b..75bad25 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ ], "scripts": { "analyze": "size-limit --why", + "contracts:update": "rm -rf src/contracts/deployments src/contracts/typechain-types && mkdir -p src/contracts && mkdir -p src/contracts && cp -r ../contracts/typechain-types src/contracts/. && cp -r ../contracts/deployments src/contracts/.", "build": "dts build && cp -r dist/sdk/src/. dist", "lint": "dts lint", "prepare": "dts build", diff --git a/src/contracts/deployments/arbsep/.chainId b/src/contracts/deployments/arbsep/.chainId new file mode 100644 index 0000000..71ba4d6 --- /dev/null +++ b/src/contracts/deployments/arbsep/.chainId @@ -0,0 +1 @@ +421614 \ No newline at end of file diff --git a/src/contracts/deployments/arbsep/Hash2Verifier.json b/src/contracts/deployments/arbsep/Hash2Verifier.json new file mode 100644 index 0000000..d84ebf8 --- /dev/null +++ b/src/contracts/deployments/arbsep/Hash2Verifier.json @@ -0,0 +1,148 @@ +{ + "address": "0xB34505B7fcfA024B5ADE57691BCD96F0778df5BA", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x6ac394a1669279d840da8c2c01f78bf24781a47777743d5354a6f06c5fd139d5", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0xB34505B7fcfA024B5ADE57691BCD96F0778df5BA", + "transactionIndex": 2, + "gasUsed": "3968713", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x714e9e1ab0d3d6c0772bdb51e6f0a816e840b48c5cca2059d13889610f93dd2d", + "transactionHash": "0x6ac394a1669279d840da8c2c01f78bf24781a47777743d5354a6f06c5fd139d5", + "logs": [], + "blockNumber": 23808629, + "cumulativeGasUsed": "4119599", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"Hash2Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d81526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212200c21fd4281d309d89bb04fca76b8c8954e9819b6424a3f711852453024ec3e7f64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d81526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212200c21fd4281d309d89bb04fca76b8c8954e9819b6424a3f711852453024ec3e7f64736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/arbsep/NoteVerifier.json b/src/contracts/deployments/arbsep/NoteVerifier.json new file mode 100644 index 0000000..cf6cb07 --- /dev/null +++ b/src/contracts/deployments/arbsep/NoteVerifier.json @@ -0,0 +1,148 @@ +{ + "address": "0x392c24C5E511f1605016989A56f04f009e52D043", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x44b5cc39205114164f2c8e2b1100b2a6bc30978e029b619b18f3c9b51b163ea4", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0x392c24C5E511f1605016989A56f04f009e52D043", + "transactionIndex": 4, + "gasUsed": "3968148", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6d0eba075361660a6acd0ba53e6e4ba8c991bf62e2098de5e548bf23a7570ca9", + "transactionHash": "0x44b5cc39205114164f2c8e2b1100b2a6bc30978e029b619b18f3c9b51b163ea4", + "logs": [], + "blockNumber": 23808639, + "cumulativeGasUsed": "6125810", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"NoteVerifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517fc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f296259081526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212202c3afaf2ebe595d19832cfb10581f8641bd099139221697c0f8462367c3cc8b264736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517fc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f296259081526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212202c3afaf2ebe595d19832cfb10581f8641bd099139221697c0f8462367c3cc8b264736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/arbsep/Pool.json b/src/contracts/deployments/arbsep/Pool.json new file mode 100644 index 0000000..c8cc3f0 --- /dev/null +++ b/src/contracts/deployments/arbsep/Pool.json @@ -0,0 +1,639 @@ +{ + "address": "0x96afddAe514089F3517703f7262784f5b813F2dA", + "abi": [ + { + "inputs": [ + { + "internalType": "contract SplitJoin16Verifier", + "name": "_splitJoinVerifier", + "type": "address" + }, + { + "internalType": "contract Hash2Verifier", + "name": "_hash2Verifier", + "type": "address" + }, + { + "internalType": "contract NoteVerifier", + "name": "_noteVerifier", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_usdc", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "Field", + "name": "commitment", + "type": "uint256" + } + ], + "name": "NewCommitment", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "Field", + "name": "commitment", + "type": "uint256" + } + ], + "name": "NullifierSpent", + "type": "event" + }, + { + "inputs": [], + "name": "INIT_CODE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ROOT_HISTORY_SIZE", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZERO_COMMITMENT", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZERO_NULLIFIER", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZERO_ROOT", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "Field", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "stealthAddressOwnershipZkProof", + "type": "bytes" + }, + { + "internalType": "Field", + "name": "noteCommitment", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "noteCreationZkProof", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "Field", + "name": "salt", + "type": "uint256" + } + ], + "name": "compute", + "outputs": [ + { + "internalType": "address", + "name": "stealthAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentRootIndex", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "Field", + "name": "noteCommitment", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "filledSubtrees", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastRoot", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "hash2Verifier", + "outputs": [ + { + "internalType": "contract Hash2Verifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "Field", + "name": "root", + "type": "uint256" + } + ], + "name": "isKnownRoot", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "Field", + "name": "nullifier", + "type": "uint256" + } + ], + "name": "isNoteSpent", + "outputs": [ + { + "internalType": "bool", + "name": "isSpent", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "levels", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextIndex", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "noteCommitments", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "noteVerifier", + "outputs": [ + { + "internalType": "contract NoteVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "roots", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "splitJoinVerifier", + "outputs": [ + { + "internalType": "contract SplitJoin16Verifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + }, + { + "internalType": "Field[]", + "name": "publicInputs", + "type": "uint256[]" + } + ], + "name": "transact", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "usdc", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + } + ], + "name": "zeros", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0xfced1111c24ad731f662e03a683a97f4a128b758402bfac930db42a80eccf7f4", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0x96afddAe514089F3517703f7262784f5b813F2dA", + "transactionIndex": 1, + "gasUsed": "11251583", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x820666eff2d59f85efe107cfec14c30da8bf011e04468f84047f20d70147c2a8", + "transactionHash": "0xfced1111c24ad731f662e03a683a97f4a128b758402bfac930db42a80eccf7f4", + "logs": [], + "blockNumber": 23808650, + "cumulativeGasUsed": "11251583", + "status": 1, + "byzantium": true + }, + "args": [ + "0x4298B6a7E18A55996697DDD009BbD5BeEADF199F", + "0xB34505B7fcfA024B5ADE57691BCD96F0778df5BA", + "0x392c24C5E511f1605016989A56f04f009e52D043", + "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8" + ], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract SplitJoin16Verifier\",\"name\":\"_splitJoinVerifier\",\"type\":\"address\"},{\"internalType\":\"contract Hash2Verifier\",\"name\":\"_hash2Verifier\",\"type\":\"address\"},{\"internalType\":\"contract NoteVerifier\",\"name\":\"_noteVerifier\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_usdc\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"Field\",\"name\":\"commitment\",\"type\":\"uint256\"}],\"name\":\"NewCommitment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"Field\",\"name\":\"commitment\",\"type\":\"uint256\"}],\"name\":\"NullifierSpent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"INIT_CODE_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROOT_HISTORY_SIZE\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ZERO_COMMITMENT\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ZERO_NULLIFIER\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ZERO_ROOT\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"Field\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"stealthAddressOwnershipZkProof\",\"type\":\"bytes\"},{\"internalType\":\"Field\",\"name\":\"noteCommitment\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"noteCreationZkProof\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Field\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"compute\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"stealthAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRootIndex\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"Field\",\"name\":\"noteCommitment\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"filledSubtrees\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRoot\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hash2Verifier\",\"outputs\":[{\"internalType\":\"contract Hash2Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Field\",\"name\":\"root\",\"type\":\"uint256\"}],\"name\":\"isKnownRoot\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Field\",\"name\":\"nullifier\",\"type\":\"uint256\"}],\"name\":\"isNoteSpent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isSpent\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"levels\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextIndex\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"noteCommitments\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"noteVerifier\",\"outputs\":[{\"internalType\":\"contract NoteVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"roots\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"splitJoinVerifier\",\"outputs\":[{\"internalType\":\"contract SplitJoin16Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"internalType\":\"Field[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\"}],\"name\":\"transact\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdc\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"zeros\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getLastRoot()\":{\"details\":\"Returns the last root\"},\"isKnownRoot(uint256)\":{\"details\":\"Whether the root is present in the root history\"},\"zeros(uint256)\":{\"details\":\"provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Pool.sol\":\"Pool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Not enough balance for performing a CREATE2 deploy.\\n */\\n error Create2InsufficientBalance(uint256 balance, uint256 needed);\\n\\n /**\\n * @dev There's no code to deploy.\\n */\\n error Create2EmptyBytecode();\\n\\n /**\\n * @dev The deployment failed.\\n */\\n error Create2FailedDeployment();\\n\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\\n if (address(this).balance < amount) {\\n revert Create2InsufficientBalance(address(this).balance, amount);\\n }\\n if (bytecode.length == 0) {\\n revert Create2EmptyBytecode();\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n if (addr == address(0)) {\\n revert Create2FailedDeployment();\\n }\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2b9807d194b92f1068d868e9587d27037264a9a067c778486f86ae21c61cbd5e\",\"license\":\"MIT\"},\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/MerkleTreeWithHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport {Poseidon2} from \\\"./libraries/Poseidon2.sol\\\";\\nimport {Field, ImplField} from \\\"./libraries/Field.sol\\\";\\n\\ncontract MerkleTreeWithHistory {\\n using ImplField for Field;\\n\\n uint32 public levels;\\n\\n // the following variables are made public for easier testing and debugging and\\n // are not supposed to be accessed in regular code\\n\\n // filledSubtrees and roots could be bytes32[size], but using mappings makes it cheaper because\\n // it removes index range check on every interaction\\n mapping(uint256 => Field) public filledSubtrees; // Field[depth]\\n mapping(uint256 => Field) public roots; // Field[ROOT_HISTORY_SIZE]\\n uint32 public constant ROOT_HISTORY_SIZE = 30;\\n uint32 public currentRootIndex = 0;\\n uint32 public nextIndex = 0;\\n\\n constructor(uint32 _levels) {\\n require(_levels > 0, \\\"_levels should be greater than zero\\\");\\n require(_levels <= 32, \\\"_levels should be less than eq 32\\\");\\n levels = _levels;\\n\\n for (uint32 i = 0; i < _levels; i++) {\\n filledSubtrees[i] = zeros(i);\\n }\\n\\n roots[0] = zeros(_levels - 1);\\n }\\n\\n function _insert(Field leaf) internal returns (uint32 index) {\\n uint32 _nextIndex = nextIndex;\\n require(\\n _nextIndex != uint32(2) ** levels,\\n \\\"Merkle tree is full. No more leaves can be added\\\"\\n );\\n uint32 currentIndex = _nextIndex;\\n Field currentLevelHash = leaf;\\n Field left;\\n Field right;\\n\\n for (uint32 i = 0; i < levels; i++) {\\n if (currentIndex % 2 == 0) {\\n left = currentLevelHash;\\n right = zeros(i);\\n filledSubtrees[i] = currentLevelHash;\\n } else {\\n left = filledSubtrees[i];\\n right = currentLevelHash;\\n }\\n currentLevelHash = Poseidon2.hash_2(left, right);\\n currentIndex /= 2;\\n }\\n\\n uint32 newRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE;\\n currentRootIndex = newRootIndex;\\n roots[newRootIndex] = currentLevelHash;\\n nextIndex = _nextIndex + 1;\\n return _nextIndex;\\n }\\n\\n /**\\n @dev Whether the root is present in the root history\\n */\\n function isKnownRoot(Field root) public view returns (bool) {\\n if (root.isZero()) {\\n return false;\\n }\\n uint32 _currentRootIndex = currentRootIndex;\\n uint32 i = _currentRootIndex;\\n do {\\n if (root.eq(roots[i])) {\\n return true;\\n }\\n if (i == 0) {\\n i = ROOT_HISTORY_SIZE;\\n }\\n i--;\\n } while (i != _currentRootIndex);\\n return false;\\n }\\n\\n /**\\n @dev Returns the last root\\n */\\n function getLastRoot() public view returns (Field) {\\n return roots[currentRootIndex];\\n }\\n\\n /// @dev provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels\\n function zeros(uint256 i) public pure returns (Field) {\\n if (i == 0) return Field.wrap(0);\\n else if (i == 1)\\n return\\n Field.wrap(\\n 0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1\\n );\\n else if (i == 2)\\n return\\n Field.wrap(\\n 0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290\\n );\\n else if (i == 3)\\n return\\n Field.wrap(\\n 0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20\\n );\\n else if (i == 4)\\n return\\n Field.wrap(\\n 0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e\\n );\\n else if (i == 5)\\n return\\n Field.wrap(\\n 0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf\\n );\\n else if (i == 6)\\n return\\n Field.wrap(\\n 0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76\\n );\\n else if (i == 7)\\n return\\n Field.wrap(\\n 0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b\\n );\\n else if (i == 8)\\n return\\n Field.wrap(\\n 0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1\\n );\\n else if (i == 9)\\n return\\n Field.wrap(\\n 0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972\\n );\\n else if (i == 10)\\n return\\n Field.wrap(\\n 0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686\\n );\\n else if (i == 11)\\n return\\n Field.wrap(\\n 0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7\\n );\\n else if (i == 12)\\n return\\n Field.wrap(\\n 0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73\\n );\\n else if (i == 13)\\n return\\n Field.wrap(\\n 0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1\\n );\\n else if (i == 14)\\n return\\n Field.wrap(\\n 0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a\\n );\\n else if (i == 15)\\n return\\n Field.wrap(\\n 0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9\\n );\\n else if (i == 16)\\n return\\n Field.wrap(\\n 0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3\\n );\\n else if (i == 17)\\n return\\n Field.wrap(\\n 0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3\\n );\\n else if (i == 18)\\n return\\n Field.wrap(\\n 0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5\\n );\\n else if (i == 19)\\n return\\n Field.wrap(\\n 0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5\\n );\\n else if (i == 20)\\n return\\n Field.wrap(\\n 0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755\\n );\\n else if (i == 21)\\n return\\n Field.wrap(\\n 0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3\\n );\\n else if (i == 22)\\n return\\n Field.wrap(\\n 0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30\\n );\\n else if (i == 23)\\n return\\n Field.wrap(\\n 0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4\\n );\\n else if (i == 24)\\n return\\n Field.wrap(\\n 0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491\\n );\\n else if (i == 25)\\n return\\n Field.wrap(\\n 0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2\\n );\\n else if (i == 26)\\n return\\n Field.wrap(\\n 0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9\\n );\\n else if (i == 27)\\n return\\n Field.wrap(\\n 0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3\\n );\\n else if (i == 28)\\n return\\n Field.wrap(\\n 0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f\\n );\\n else if (i == 29)\\n return\\n Field.wrap(\\n 0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c\\n );\\n else if (i == 30)\\n return\\n Field.wrap(\\n 0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee\\n );\\n else if (i == 31)\\n return\\n Field.wrap(\\n 0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14\\n );\\n else if (i == 32)\\n return\\n Field.wrap(\\n 0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d\\n );\\n else revert(\\\"Index out of bounds\\\");\\n }\\n}\\n\",\"keccak256\":\"0x4a78cc71a6aac6f7174a9da2b3f481f42ee83ade33e40240573081e8b0f3c628\",\"license\":\"MIT\"},\"contracts/Pool.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {Create2} from \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport {Field, ImplField} from \\\"./libraries/Field.sol\\\";\\nimport {SplitJoin16Verifier, Hash2Verifier, NoteVerifier} from \\\"./Verifier.sol\\\";\\nimport {StealthAddress} from \\\"./StealthAddress.sol\\\";\\nimport {MerkleTreeWithHistory} from \\\"./MerkleTreeWithHistory.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\ncontract Pool is MerkleTreeWithHistory {\\n using ImplField for Field;\\n using ImplField for uint256;\\n using ImplField for int256;\\n using ImplField for bytes32;\\n using ImplField for address;\\n using ImplField for Field[];\\n\\n Field constant FIELD_ZERO = Field.wrap(0);\\n\\n Field public constant ZERO_ROOT =\\n Field.wrap(\\n 0x087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf\\n );\\n Field public constant ZERO_COMMITMENT =\\n Field.wrap(\\n 0x0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a\\n );\\n Field public constant ZERO_NULLIFIER =\\n Field.wrap(\\n 0x262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb2\\n );\\n\\n bytes32 public constant INIT_CODE_HASH =\\n keccak256(type(StealthAddress).creationCode);\\n\\n IERC20 public usdc;\\n SplitJoin16Verifier public splitJoinVerifier;\\n Hash2Verifier public hash2Verifier;\\n NoteVerifier public noteVerifier;\\n\\n mapping(Field nullifier => bool isSpent) public isNoteSpent;\\n Field[] public noteCommitments;\\n\\n event NewCommitment(Field commitment);\\n event NullifierSpent(Field commitment);\\n\\n constructor(\\n SplitJoin16Verifier _splitJoinVerifier,\\n Hash2Verifier _hash2Verifier,\\n NoteVerifier _noteVerifier,\\n IERC20 _usdc\\n ) MerkleTreeWithHistory(16) {\\n splitJoinVerifier = _splitJoinVerifier;\\n hash2Verifier = _hash2Verifier;\\n noteVerifier = _noteVerifier;\\n usdc = _usdc;\\n _insert(ZERO_COMMITMENT);\\n }\\n\\n function deposit(\\n uint amount,\\n Field noteCommitment,\\n bytes memory proof\\n ) external {\\n _createDepositUsingHash3(amount, noteCommitment, proof);\\n }\\n\\n // proving split join takes about 5 seconds\\n function transact(\\n bytes memory proof,\\n Field[] memory publicInputs\\n ) external {\\n // verify that the note has not been spent\\n require(isKnownRoot(publicInputs[0]), \\\"Deposits root unknown\\\");\\n (bool isDeposit, uint amount) = publicInputs[1].signed();\\n\\n if (!publicInputs[3].eq(ZERO_NULLIFIER)) {\\n require(!isNoteSpent[publicInputs[3]], \\\"Note is spent\\\");\\n isNoteSpent[publicInputs[3]] = true;\\n emit NullifierSpent(publicInputs[3]);\\n }\\n if (!publicInputs[4].eq(ZERO_NULLIFIER)) {\\n require(!isNoteSpent[publicInputs[4]], \\\"Note is spent\\\");\\n isNoteSpent[publicInputs[4]] = true;\\n emit NullifierSpent(publicInputs[4]);\\n }\\n\\n require(\\n splitJoinVerifier.verify(proof, publicInputs.into()),\\n \\\"split join zk proof failed\\\"\\n );\\n\\n // insert note in merkle tree and calculate new root\\n emit NewCommitment(publicInputs[4]);\\n noteCommitments.push(publicInputs[4]);\\n _insert(publicInputs[4]);\\n\\n if (isDeposit) {\\n // pull USDC\\n usdc.transferFrom(msg.sender, address(this), amount);\\n } else {\\n // transfer USDC\\n usdc.transfer(publicInputs[2].toAddress(), amount);\\n }\\n }\\n\\n function collect(\\n IERC20 token,\\n uint balance,\\n Field salt,\\n bytes memory stealthAddressOwnershipZkProof,\\n Field noteCommitment,\\n bytes memory noteCreationZkProof\\n ) external {\\n require(\\n hash2Verifier.verify(stealthAddressOwnershipZkProof, salt.toArr()),\\n \\\"hash2 zk proof failed\\\"\\n );\\n StealthAddress wallet = _deployIfNeeded(salt.toBytes32());\\n wallet.transferErc20(token, address(this), balance);\\n _createDepositUsingHash3(balance, noteCommitment, noteCreationZkProof);\\n }\\n\\n function compute(Field salt) public view returns (address stealthAddress) {\\n return Create2.computeAddress(salt.toBytes32(), INIT_CODE_HASH);\\n }\\n\\n function _deployIfNeeded(bytes32 salt) internal returns (StealthAddress) {\\n address computed = Create2.computeAddress(salt, INIT_CODE_HASH);\\n uint size;\\n assembly {\\n size := extcodesize(computed)\\n }\\n if (size == 0) {\\n bytes memory bytecode = type(StealthAddress).creationCode;\\n address deployed;\\n assembly {\\n deployed := create2(\\n 0,\\n add(bytecode, 0x20),\\n mload(bytecode),\\n salt\\n )\\n }\\n require(\\n deployed != address(0),\\n \\\"WalletFactory: failed to deploy wallet\\\"\\n );\\n require(deployed == computed, \\\"WalletFactory: deploy mismatch\\\");\\n }\\n return StealthAddress(payable(computed));\\n }\\n\\n // proving note takes about 1 sec\\n function _createDepositUsingHash3(\\n uint amount,\\n Field noteCommitment,\\n bytes memory proof\\n ) internal {\\n // verify that amount is in note commitment preimage using the zk proof\\n Field[] memory publicInputs = new Field[](2);\\n publicInputs[0] = amount.toField();\\n publicInputs[1] = noteCommitment;\\n\\n require(\\n noteVerifier.verify(proof, publicInputs.into()),\\n \\\"note zk proof failed\\\"\\n );\\n\\n // insert note in merkle tree and calculate new root\\n // TODO this requires poseidon2 to be implemented in solidity,\\n // temporarily taking this from solidity\\n // proving the new deposit root will cause mutex issue hence\\n // we have to do poseidon2 in solidity to allow parallel users.\\n noteCommitments.push(noteCommitment);\\n _insert(noteCommitment);\\n }\\n\\n // proving split join takes about 5 seconds\\n function _createDepositUsingSplitJoin(\\n uint amount,\\n Field noteCommitment,\\n bytes memory proof\\n ) internal {\\n // verify that amount is in note commitment preimage using the zk proof\\n Field[] memory publicInputs = new Field[](6);\\n publicInputs[0] = ZERO_ROOT;\\n publicInputs[1] = amount.toField();\\n publicInputs[2] = FIELD_ZERO;\\n publicInputs[3] = ZERO_NULLIFIER;\\n publicInputs[4] = ZERO_NULLIFIER;\\n publicInputs[5] = noteCommitment;\\n\\n require(\\n splitJoinVerifier.verify(proof, publicInputs.into()),\\n \\\"split join zk proof failed\\\"\\n );\\n\\n // insert note in merkle tree and calculate new root\\n // TODO this requires poseidon2 to be implemented in solidity,\\n // temporarily taking this from solidity\\n // proving the new deposit root will cause mutex issue hence\\n // we have to do poseidon2 in solidity to allow parallel users.\\n noteCommitments.push(noteCommitment);\\n _insert(noteCommitment);\\n }\\n}\\n\",\"keccak256\":\"0x207cdf65853db9e7b762e16a59c9b68eed342b7408dc6fd499ce70b4dc46ddd3\",\"license\":\"UNLICENSED\"},\"contracts/StealthAddress.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ncontract StealthAddress {\\n address public pool;\\n\\n constructor() {\\n pool = msg.sender;\\n }\\n\\n modifier onlyPool() {\\n require(msg.sender == pool, \\\"only factory\\\");\\n _;\\n }\\n\\n receive() external payable {}\\n\\n function transferErc20(\\n IERC20 token,\\n address dest,\\n uint amount\\n ) external onlyPool returns (bool success) {\\n return token.transfer(dest, amount);\\n }\\n\\n function call(\\n address dest,\\n uint value,\\n bytes calldata data\\n ) external onlyPool returns (bool success, bytes memory returndata) {\\n (success, returndata) = dest.call{value: value}(data);\\n }\\n}\\n\",\"keccak256\":\"0x89b5680e201e061ad7102ef74bd6385b2a672b91330be9e501fc3e7c2af59853\",\"license\":\"UNLICENSED\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"},\"contracts/libraries/Field.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\ntype Field is uint256;\\n\\nlibrary ImplField {\\n uint constant PRIME =\\n 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001;\\n uint constant PRIME_DIV_2 =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n\\n function checkField(Field a) internal pure {\\n require(Field.unwrap(a) < PRIME, \\\"Field: input is too large\\\");\\n }\\n\\n function toFieldUnchecked(uint256 a) internal pure returns (Field b) {\\n b = Field.wrap(a);\\n }\\n function toField(uint256 a) internal pure returns (Field b) {\\n b = Field.wrap(a);\\n checkField(b);\\n }\\n\\n function toFieldUnchecked(bytes32 a) internal pure returns (Field b) {\\n assembly {\\n b := a\\n }\\n }\\n function toField(bytes32 a) internal pure returns (Field b) {\\n assembly {\\n b := a\\n }\\n checkField(b);\\n }\\n\\n function toBytes32(Field a) internal pure returns (bytes32 b) {\\n assembly {\\n b := a\\n }\\n }\\n\\n function toAddress(Field a) internal pure returns (address b) {\\n require(Field.unwrap(a) < (1 << 160), \\\"Field: input is too large\\\");\\n assembly {\\n b := a\\n }\\n }\\n\\n function toArr(Field a) internal pure returns (bytes32[] memory b) {\\n b = new bytes32[](1);\\n b[0] = toBytes32(a);\\n }\\n\\n function toField(address a) internal pure returns (Field b) {\\n assembly {\\n b := a\\n }\\n }\\n\\n function toField(int256 a) internal pure returns (Field) {\\n // return Field.wrap(a);\\n if (a < 0) {\\n require(uint(-a) < PRIME, \\\"Field: input is too large\\\");\\n return Field.wrap(PRIME - uint256(-a));\\n } else {\\n require(uint(a) < PRIME, \\\"Field: input is too large\\\");\\n return Field.wrap(uint256(a));\\n }\\n }\\n\\n function into(Field[] memory a) internal pure returns (bytes32[] memory b) {\\n assembly {\\n b := a\\n }\\n }\\n\\n function add(Field a, Field b) internal pure returns (Field c) {\\n assembly {\\n c := addmod(a, b, PRIME)\\n }\\n }\\n\\n function mul(Field a, Field b) internal pure returns (Field c) {\\n assembly {\\n c := mulmod(a, b, PRIME)\\n }\\n }\\n\\n function add(Field a, uint b) internal pure returns (Field c) {\\n assembly {\\n c := addmod(a, b, PRIME)\\n }\\n }\\n\\n function mul(Field a, uint b) internal pure returns (Field c) {\\n assembly {\\n c := mulmod(a, b, PRIME)\\n }\\n }\\n\\n function eq(Field a, Field b) internal pure returns (bool c) {\\n assembly {\\n c := eq(a, b)\\n }\\n }\\n\\n function isZero(Field a) internal pure returns (bool c) {\\n assembly {\\n c := eq(a, 0)\\n }\\n }\\n\\n function signed(\\n Field a\\n ) internal pure returns (bool positive, uint scalar) {\\n uint256 raw = Field.unwrap(a);\\n if (raw > PRIME_DIV_2) {\\n return (false, PRIME - raw);\\n } else {\\n return (true, raw);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd502d38a494a495f33e3dd385774ed6dc69d56d5c10bddad60c41b08a1dc2fd9\",\"license\":\"UNLICENSED\"},\"contracts/libraries/Poseidon2.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {Field, ImplField} from \\\"./Field.sol\\\";\\n\\nlibrary Poseidon2 {\\n using ImplField for Field;\\n using Poseidon2 for Sponge;\\n\\n uint constant t = 4;\\n uint constant rounds_f = 8;\\n uint constant rounds_p = 56;\\n uint constant RATE = 3;\\n\\n struct Constants {\\n Field[4] internal_matrix_diagonal;\\n Field[4][64] round_constant;\\n }\\n\\n struct Sponge {\\n Field iv;\\n Field[3] cache;\\n Field[4] state;\\n uint cache_size;\\n bool squeeze_mode; // 0 => absorb, 1 => squeeze\\n Constants constants;\\n }\\n\\n /**\\n * Public API: best for single time use\\n */\\n\\n function hash_1(Field m) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](1);\\n inputs[0] = m;\\n return hash_internal(load(), inputs, 1, false);\\n }\\n\\n function hash_2(Field m1, Field m2) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](2);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n return hash_internal(load(), inputs, 2, false);\\n }\\n\\n function hash_3(\\n Field m1,\\n Field m2,\\n Field m3\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](3);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n inputs[2] = m3;\\n return hash_internal(load(), inputs, 3, false);\\n }\\n\\n function hash_var_len(\\n Field[] memory inputs,\\n uint std_input_length\\n ) internal pure returns (Field) {\\n return hash_internal(load(), inputs, std_input_length, true);\\n }\\n\\n /**\\n * Public API: best for multiple use in same call context\\n */\\n\\n function hash_1(\\n Poseidon2.Constants memory constants,\\n Field m\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](1);\\n inputs[0] = m;\\n return hash_internal(constants, inputs, 1, false);\\n }\\n\\n function hash_2(\\n Poseidon2.Constants memory constants,\\n Field m1,\\n Field m2\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](2);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n return hash_internal(constants, inputs, 2, false);\\n }\\n\\n function hash_3(\\n Poseidon2.Constants memory constants,\\n Field m1,\\n Field m2,\\n Field m3\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](3);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n inputs[2] = m3;\\n return hash_internal(constants, inputs, 3, false);\\n }\\n\\n function hash_var_len(\\n Poseidon2.Constants memory constants,\\n Field[] memory inputs,\\n uint std_input_length\\n ) internal pure returns (Field) {\\n return hash_internal(constants, inputs, std_input_length, true);\\n }\\n\\n /**\\n * Internal methods for hashing\\n */\\n\\n // function hash_internal(\\n // Poseidon2.Sponge memory sponge,\\n // Field[] memory input,\\n // uint std_input_length,\\n // bool is_variable_length\\n // ) private pure returns (Field) {\\n // for (uint i; i < input.length; i++) {\\n // if (i < std_input_length) {\\n // sponge.absorb(input[i]);\\n // }\\n // }\\n\\n // // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\\n // // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\\n // // fixed-length and variable-length hashes do not collide)\\n // if (is_variable_length) {\\n // sponge.absorb(Field.wrap(1));\\n // }\\n // return sponge.squeeze();\\n // }\\n\\n function generate_iv(uint input_length) internal pure returns (Field) {\\n return Field.wrap(input_length << 64);\\n }\\n\\n function hash_internal(\\n Constants memory constants,\\n Field[] memory input,\\n uint std_input_length,\\n bool is_variable_length\\n ) private pure returns (Field) {\\n Poseidon2.Sponge memory sponge = new_poseidon2(\\n generate_iv(input.length),\\n constants\\n );\\n\\n for (uint i; i < input.length; i++) {\\n if (i < std_input_length) {\\n sponge.absorb(input[i]);\\n }\\n }\\n\\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\\n // fixed-length and variable-length hashes do not collide)\\n if (is_variable_length) {\\n sponge.absorb(Field.wrap(1));\\n }\\n return sponge.squeeze();\\n }\\n\\n function new_poseidon2(\\n Field iv,\\n Constants memory constants\\n ) private pure returns (Poseidon2.Sponge memory) {\\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\\n iv: iv,\\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n cache_size: 0,\\n squeeze_mode: false,\\n constants: constants\\n });\\n result.state[RATE] = iv;\\n return result;\\n }\\n\\n function new_poseidon2_with_constants(\\n Field iv,\\n Constants memory constants\\n ) private pure returns (Poseidon2.Sponge memory) {\\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\\n iv: iv,\\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n cache_size: 0,\\n squeeze_mode: false,\\n constants: constants\\n });\\n result.state[RATE] = iv;\\n return result;\\n }\\n\\n function perform_duplex(\\n Poseidon2.Sponge memory self\\n ) internal pure returns (Field[RATE] memory) {\\n // zero-pad the cache\\n for (uint i; i < RATE; i++) {\\n if (i >= self.cache_size) {\\n self.cache[i] = Field.wrap(0);\\n }\\n }\\n\\n // add the cache into sponge state\\n for (uint i; i < RATE; i++) {\\n self.state[i] = self.state[i].add(self.cache[i]);\\n }\\n self.state = permutation(\\n self.state,\\n self.constants.internal_matrix_diagonal,\\n self.constants.round_constant\\n );\\n // return `RATE` number of field elements from the sponge state.\\n Field[RATE] memory result = [\\n Field.wrap(0),\\n Field.wrap(0),\\n Field.wrap(0)\\n ];\\n for (uint i; i < RATE; i++) {\\n result[i] = self.state[i];\\n }\\n return result;\\n }\\n\\n function absorb(Poseidon2.Sponge memory self, Field input) internal pure {\\n if ((!self.squeeze_mode) && (self.cache_size == RATE)) {\\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\\n self.perform_duplex();\\n self.cache[0] = input;\\n self.cache_size = 1;\\n } else if ((!self.squeeze_mode) && (self.cache_size != RATE)) {\\n // If we're absorbing, and the cache is not full, add the input into the cache\\n self.cache[self.cache_size] = input;\\n self.cache_size += 1;\\n } else if (self.squeeze_mode) {\\n // If we're in squeeze mode, switch to absorb mode and add the input into the cache.\\n // N.B. I don't think this code path can be reached?!\\n self.cache[0] = input;\\n self.cache_size = 1;\\n self.squeeze_mode = false;\\n }\\n }\\n\\n function squeeze(\\n Poseidon2.Sponge memory self\\n ) internal pure returns (Field) {\\n if (self.squeeze_mode && (self.cache_size == 0)) {\\n // If we're in squeze mode and the cache is empty, there is nothing left to squeeze out of the sponge!\\n // Switch to absorb mode.\\n self.squeeze_mode = false;\\n self.cache_size = 0;\\n }\\n if (!self.squeeze_mode) {\\n // If we're in absorb mode, apply sponge permutation to compress the cache, populate cache with compressed\\n // state and switch to squeeze mode. Note: this code block will execute if the previous `if` condition was\\n // matched\\n Field[RATE] memory new_output_elements = self.perform_duplex();\\n self.squeeze_mode = true;\\n for (uint i; i < RATE; i++) {\\n self.cache[i] = new_output_elements[i];\\n }\\n self.cache_size = RATE;\\n }\\n // By this point, we should have a non-empty cache. Pop one item off the top of the cache and return it.\\n Field result = self.cache[0];\\n for (uint i = 1; i < RATE; i++) {\\n if (i < self.cache_size) {\\n self.cache[i - 1] = self.cache[i];\\n }\\n }\\n\\n self.cache_size -= 1;\\n self.cache[self.cache_size] = Field.wrap(0);\\n return result;\\n }\\n\\n function permutation(\\n Field[4] memory inputs,\\n Field[4] memory internal_matrix_diagonal,\\n Field[4][64] memory round_constant\\n ) private pure returns (Field[4] memory) {\\n // Read witness assignments\\n Field[4] memory state = [\\n Field.wrap(0),\\n Field.wrap(0),\\n Field.wrap(0),\\n Field.wrap(0)\\n ];\\n for (uint i; i < 4; i++) {\\n state[i] = inputs[i];\\n }\\n\\n // Apply 1st linear layer\\n matrix_multiplication_4x4(state);\\n\\n // First set of external rounds\\n uint rf_first = rounds_f / 2;\\n for (uint r; r < rf_first; r++) {\\n add_round_constants(state, round_constant, r);\\n s_box(state);\\n matrix_multiplication_4x4(state);\\n }\\n\\n // Internal rounds\\n uint p_end = rf_first + rounds_p;\\n for (uint r = rf_first; r < p_end; r++) {\\n state[0] = state[0].add(round_constant[r][0]);\\n state[0] = single_box(state[0]);\\n internal_m_multiplication(state, internal_matrix_diagonal);\\n }\\n\\n // Remaining external rounds\\n uint num_rounds = rounds_f + rounds_p;\\n\\n for (uint r = p_end; r < num_rounds; r++) {\\n add_round_constants(state, round_constant, r);\\n s_box(state);\\n matrix_multiplication_4x4(state);\\n }\\n\\n return state;\\n }\\n\\n function single_box(Field x) private pure returns (Field) {\\n Field s = x.mul(x);\\n return s.mul(s).mul(x);\\n }\\n\\n function s_box(Field[4] memory input) private pure {\\n for (uint i; i < 4; i++) {\\n input[i] = single_box(input[i]);\\n }\\n }\\n\\n function add_round_constants(\\n Field[4] memory state,\\n Field[4][64] memory round_constant,\\n uint round\\n ) private pure {\\n for (uint i; i < 4; i++) {\\n state[i] = state[i].add(round_constant[round][i]);\\n }\\n }\\n\\n function matrix_multiplication_4x4(Field[4] memory input) private pure {\\n Field t0 = input[0].add(input[1]); // A + B\\n Field t1 = input[2].add(input[3]); // C + D\\n Field t2 = input[1].add(input[1]); // 2B\\n t2 = t2.add(t1); // 2B + C + D\\n Field t3 = input[3].add(input[3]); // 2D\\n t3 = t3.add(t0); // 2D + A + B\\n Field t4 = t1.add(t1);\\n t4 = t4.add(t4);\\n t4 = t4.add(t3); // A + B + 4C + 6D\\n Field t5 = t0.add(t0);\\n t5 = t5.add(t5);\\n t5 = t5.add(t2); // 4A + 6B + C + D\\n Field t6 = t3.add(t5); // 5A + 7B + C + 3D\\n Field t7 = t2.add(t4); // A + 3B + 5C + 7D\\n input[0] = t6;\\n input[1] = t5;\\n input[2] = t7;\\n input[3] = t4;\\n }\\n\\n function internal_m_multiplication(\\n Field[4] memory input,\\n Field[4] memory internal_matrix_diagonal\\n ) private pure {\\n Field sum = Field.wrap(0);\\n for (uint i; i < 4; i++) {\\n sum = sum.add(input[i]);\\n }\\n for (uint i; i < 4; i++) {\\n input[i] = input[i].mul(internal_matrix_diagonal[i]);\\n input[i] = input[i].add(sum);\\n }\\n }\\n\\n function load() internal pure returns (Constants memory constants) {\\n constants = Constants({\\n internal_matrix_diagonal: [\\n Field.wrap(\\n 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7\\n ),\\n Field.wrap(\\n 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b\\n ),\\n Field.wrap(\\n 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15\\n ),\\n Field.wrap(\\n 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b\\n )\\n ],\\n round_constant: [\\n [\\n Field.wrap(\\n 0x19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5\\n ),\\n Field.wrap(\\n 0x265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6\\n ),\\n Field.wrap(\\n 0x199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa\\n ),\\n Field.wrap(\\n 0x157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902\\n ),\\n Field.wrap(\\n 0x0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e\\n ),\\n Field.wrap(\\n 0x251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996\\n ),\\n Field.wrap(\\n 0x13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738\\n ),\\n Field.wrap(\\n 0x011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06\\n ),\\n Field.wrap(\\n 0x0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549\\n ),\\n Field.wrap(\\n 0x04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8\\n ),\\n Field.wrap(\\n 0x259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f\\n ),\\n Field.wrap(\\n 0x28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1\\n ),\\n Field.wrap(\\n 0x0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38\\n ),\\n Field.wrap(\\n 0x0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5\\n ),\\n Field.wrap(\\n 0x1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c\\n ),\\n Field.wrap(\\n 0x25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a\\n ),\\n Field.wrap(\\n 0x13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96\\n ),\\n Field.wrap(\\n 0x2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce\\n ),\\n Field.wrap(\\n 0x21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959\\n )\\n ],\\n [\\n Field.wrap(\\n 0x05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b\\n ),\\n Field.wrap(\\n 0x0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4\\n ),\\n Field.wrap(\\n 0x0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf\\n ),\\n Field.wrap(\\n 0x09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335\\n ),\\n Field.wrap(\\n 0x2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b\\n ),\\n Field.wrap(\\n 0x1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df\\n ),\\n Field.wrap(\\n 0x176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404\\n )\\n ]\\n ]\\n });\\n }\\n}\\n\",\"keccak256\":\"0x652b5b6944a7bd0e96b28edbaa3f327852eb9112a5efa4d581a5538adba60c29\",\"license\":\"UNLICENSED\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n}\\n\",\"keccak256\":\"0x7434453e6d3b7d0e5d0eb7846ffdbc27f0ccf3b163591263739b628074dc103a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052600380546001600160401b03191690553480156200002157600080fd5b50604051620073f5380380620073f5833981016040819052620000449162002b54565b601062000055565b60405180910390fd5b60208163ffffffff161115620000b85760405162461bcd60e51b815260206004820152602160248201527f5f6c6576656c732073686f756c64206265206c657373207468616e20657120336044820152601960f91b60648201526084016200004c565b6000805463ffffffff191663ffffffff83161781555b8163ffffffff168163ffffffff1610156200011757620000f463ffffffff8216620001f9565b63ffffffff821660009081526001602081905260409091209190915501620000ce565b50620001356200012960018362002bd2565b63ffffffff16620001f9565b6000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5550600480546001600160a01b038087166001600160a01b03199283161790925560058054868416908316179055600680548584169216919091179055600380549183166801000000000000000002600160401b600160e01b0319909216919091179055620001ee7f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a62000855565b505050505062002e14565b6000816000036200020c57506000919050565b816001036200023c57507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b816002036200026c57507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b816003036200029c57507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403620002cc57507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503620002fc57507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b816006036200032c57507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b816007036200035c57507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b816008036200038c57507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903620003bc57507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03620003ec57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b036200041c57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c036200044c57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d036200047c57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e03620004ac57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f03620004dc57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b816010036200050c57507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036200053c57507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036200056c57507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b816013036200059c57507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b81601403620005cc57507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b81601503620005fc57507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036200062c57507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036200065c57507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b816018036200068c57507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b81601903620006bc57507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a03620006ec57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b036200071c57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036200074c57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036200077c57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e03620007ac57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f03620007dc57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b816020036200080c57507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016200004c565b60035460008054909163ffffffff6401000000009091048116916200087d9116600262002d22565b63ffffffff168163ffffffff1603620008f25760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201526f1d995cc818d85b88189948185919195960821b60648201526084016200004c565b8083600080805b60005463ffffffff90811690821610156200099f576200091b60028662002d4f565b63ffffffff166000036200095d578392506200093d63ffffffff8216620001f9565b63ffffffff82166000908152600160205260409020859055915062000979565b63ffffffff811660009081526001602052604090205492508391505b62000985838362000a32565b93506200099460028662002d75565b9450600101620008f9565b50600354600090601e90620009bc9063ffffffff16600162002d9b565b620009c8919062002d4f565b6003805463ffffffff191663ffffffff83169081179091556000908152600260205260409020859055905062000a0086600162002d9b565b6003805463ffffffff929092166401000000000263ffffffff60201b1990921691909117905550939695505050505050565b60408051600280825260608201835260009283929190602083019080368337019050509050838160008151811062000a6e5762000a6e62002dbb565b602002602001018181525050828160018151811062000a915762000a9162002dbb565b602090810291909101015262000ab562000aaa62000abf565b8260026000620020b1565b9150505b92915050565b62000ac962002a5d565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b600080620020d1620020ca86516200214d60201b60201c565b8762002153565b905060005b85518110156200212357848110156200211a576200211a86828151811062002102576200210262002dbb565b602002602001015183620021fa60201b90919060201c565b600101620020d6565b508215620021385762002138816001620021fa565b6200214381620022b8565b9695505050505050565b60401b90565b6200215d62002a86565b60006040518060c00160405280858152602001604051806060016040528060008152602001600081526020016000815250815260200160405180608001604052806000815260200160008152602001600081526020016000815250815260200160008152602001600015158152602001848152509050838160400151600360048110620021ee57620021ee62002dbb565b60200201529392505050565b816080015115801562002211575060038260600151145b156200223357620022228262002414565b506020820151526001606090910152565b81608001511580156200224b57506003826060015114155b1562002292578082602001518360600151600381106200226f576200226f62002dbb565b6020020152606082018051600191906200228b90839062002dd1565b9052505050565b816080015115620022b457602082015181905260016060830152600060808301525b5050565b600081608001518015620022ce57506060820151155b15620022e35760006080830181905260608301525b81608001516200235b576000620022fa8362002414565b60016080850152905060005b6003811015620023515781816003811062002325576200232562002dbb565b60200201518460200151826003811062002343576200234362002dbb565b602002015260010162002306565b5050600360608301525b60208201515160015b6003811015620023cf578360600151811015620023c6578360200151816003811062002394576200239462002dbb565b60200201518460200151600183620023ad919062002de7565b60038110620023c057620023c062002dbb565b60200201525b60010162002364565b50600183606001818151620023e5919062002de7565b90525060208301516060840151600091906003811062002409576200240962002dbb565b602002015292915050565b6200241e62002ace565b60005b6003811015620024615782606001518110620024585760008360200151826003811062002452576200245262002dbb565b60200201525b60010162002421565b5060005b6003811015620024dd57620024b6836020015182600381106200248c576200248c62002dbb565b602002015184604001518360048110620024aa57620024aa62002dbb565b60200201519062002574565b83604001518260048110620024cf57620024cf62002dbb565b602002015260010162002465565b50604082015160a08301518051602090910151620024fd929190620025a1565b6040808401919091528051606081018252600080825260208201819052918101829052905b60038110156200256d578360400151816004811062002545576200254562002dbb565b60200201518282600381106200255f576200255f62002dbb565b602002015260010162002522565b5092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b620025ab62002aec565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156200261e57858160048110620025f657620025f662002dbb565b602002015182826004811062002610576200261062002dbb565b6020020152600101620025d7565b506200262a816200273c565b60006200263a6002600862002dfd565b905060005b8181101562002674576200265583868362002852565b6200266083620028d4565b6200266b836200273c565b6001016200263f565b5060006200268460388362002dd1565b9050815b81811015620026e557620026b9868260408110620026aa57620026aa62002dbb565b602002015151856000620024aa565b8452620026ce8460005b60200201516200291d565b8452620026dc84886200294d565b60010162002688565b506000620026f66038600862002dd1565b9050815b818110156200272f576200271085888362002852565b6200271b85620028d4565b62002726856200273c565b600101620026fa565b5092979650505050505050565b6000620027538260016020020151836000620024aa565b905060006200276c8360036020020151846002620024aa565b90506000620027858460016020020151856001620024aa565b905062002793818362002574565b90506000620027ac8560036020020151866003620024aa565b9050620027ba818562002574565b90506000620027ca848062002574565b9050620027d8818062002574565b9050620027e6818362002574565b90506000620027f6868062002574565b905062002804818062002574565b905062002812818562002574565b9050600062002822848362002574565b9050600062002832868562002574565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015620028ce57620028ab83836040811062002878576200287862002dbb565b6020020151826004811062002891576200289162002dbb565b6020020151858360048110620024aa57620024aa62002dbb565b848260048110620028c057620028c062002dbb565b602002015260010162002855565b50505050565b60005b6004811015620022b457620028fa828260048110620026c357620026c362002dbb565b8282600481106200290f576200290f62002dbb565b6020020152600101620028d7565b6000806200292c838062002a30565b905062002946836200293f838062002a30565b9062002a30565b9392505050565b6000805b60048110156200298c576200298184826004811062002974576200297462002dbb565b6020020151839062002574565b915060010162002951565b5060005b6004811015620028ce57620029d9838260048110620029b357620029b362002dbb565b6020020151858360048110620029cd57620029cd62002dbb565b60200201519062002a30565b848260048110620029ee57620029ee62002dbb565b602002015262002a0d82858360048110620024aa57620024aa62002dbb565b84826004811062002a225762002a2262002dbb565b602002015260010162002990565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b604051806040016040528062002a7262002aec565b815260200162002a8162002b0a565b905290565b6040518060c001604052806000815260200162002aa262002ace565b815260200162002ab162002aec565b8152600060208201819052604082015260600162002a8162002a5d565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b62002b2462002aec565b81526020019060019003908162002b1a5790505090565b6001600160a01b038116811462002b5157600080fd5b50565b6000806000806080858703121562002b6b57600080fd5b845162002b788162002b3b565b602086015190945062002b8b8162002b3b565b604086015190935062002b9e8162002b3b565b606086015190925062002bb18162002b3b565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8281168282160390808211156200256d576200256d62002bbc565b600181815b8085111562002c35578163ffffffff0482111562002c195762002c1962002bbc565b8085161562002c2757918102915b93841c939080029062002bf7565b509250929050565b60008262002c4e5750600162000ab9565b8162002c5d5750600062000ab9565b816001811462002c76576002811462002c815762002cb9565b600191505062000ab9565b60ff84111562002c955762002c9562002bbc565b6001841b915063ffffffff82111562002cb25762002cb262002bbc565b5062000ab9565b5060208310610133831016604e8410600b841016171562002cf5575081810a63ffffffff81111562002cef5762002cef62002bbc565b62000ab9565b62002d01838362002bf2565b8063ffffffff0482111562002d1a5762002d1a62002bbc565b029392505050565b600063ffffffff62000ab581851682851662002c3d565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168062002d695762002d6962002d39565b92169190910692915050565b600063ffffffff8084168062002d8f5762002d8f62002d39565b92169190910492915050565b63ffffffff8181168382160190808211156200256d576200256d62002bbc565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000ab95762000ab962002bbc565b8181038181111562000ab95762000ab962002bbc565b60008262002e0f5762002e0f62002d39565b500490565b6145d18062002e246000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806390eeb02b116100e3578063c2b40ae41161008c578063e829558811610066578063e8295588146103f4578063f178e47c14610407578063fc7e9c6f1461042757600080fd5b8063c2b40ae4146103ac578063cd87a3b4146103cc578063e40af72e146103d457600080fd5b8063a6232a93116100bd578063a6232a9314610369578063aa0b7db71461037c578063ba70f7571461038f57600080fd5b806390eeb02b1461033157806395d1d7c71461034157806398754e0a1461035657600080fd5b8063404c8149116101455780634ecf518b1161011f5780634ecf518b146102c65780635ed86d5c146102eb578063738133dc146102fe57600080fd5b8063404c8149146102655780634b8ecb0e146102785780634c5eb6761461029f57600080fd5b806329648a971161017657806329648a97146101f257806329a2b3cf146102195780633e413bee1461023957600080fd5b80631202471514610192578063257671f5146101dc575b600080fd5b6004546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101e461043f565b6040519081526020016101d3565b6101e47f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb281565b6006546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6003546101b29068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610273366004613a80565b61046c565b6101e47f087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf81565b6101e47f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a81565b6000546102d69063ffffffff1681565b60405163ffffffff90911681526020016101d3565b6101b26102f9366004613a80565b61048d565b61032161030c366004613a80565b60076020526000908152604090205460ff1681565b60405190151581526020016101d3565b6003546102d69063ffffffff1681565b61035461034f366004613b69565b6104c8565b005b610354610364366004613c14565b610662565b610321610377366004613a80565b610cee565b61035461038a366004613cde565b610d77565b60035463ffffffff166000908152600260205260409020546101e4565b6101e46103ba366004613a80565b60026020526000908152604090205481565b6102d6601e81565b6005546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610402366004613a80565b610d87565b6101e4610415366004613a80565b60016020526000908152604090205481565b6003546102d690640100000000900463ffffffff1681565b60405161044e602082016139a2565b6020820181038252601f19601f820116604052508051906020012081565b6008818154811061047c57600080fd5b600091825260209091200154905081565b60006104c2826040516104a2602082016139a2565b6020820181038252601f19601f82011660405250805190602001206113c6565b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e4846104f0876113da565b6040518363ffffffff1660e01b815260040161050d929190613d2e565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e9190613dc6565b61059f5760405162461bcd60e51b815260206004820152601560248201527f6861736832207a6b2070726f6f66206661696c6564000000000000000000000060448201526064015b60405180910390fd5b60006105aa85611421565b6040517f02cba74100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015230602483015260448201899052919250908216906302cba741906064016020604051808303816000875af1158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190613dc6565b50610659868484611589565b50505050505050565b6106858160008151811061067857610678613de8565b6020026020010151610cee565b6106d15760405162461bcd60e51b815260206004820152601560248201527f4465706f7369747320726f6f7420756e6b6e6f776e00000000000000000000006044820152606401610596565b6000806106f7836001815181106106ea576106ea613de8565b60200260200101516116f9565b915091506107487f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460038151811061073257610732613de8565b602002602001015161176690919063ffffffff16565b61086857600760008460038151811061076357610763613de8565b60209081029190910181015182528101919091526040016000205460ff16156107ce5760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b600160076000856003815181106107e7576107e7613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360038151811061084857610848613de8565b602002602001015160405161085f91815260200190565b60405180910390a15b61089f7f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460048151811061073257610732613de8565b6109bf5760076000846004815181106108ba576108ba613de8565b60209081029190910181015182528101919091526040016000205460ff16156109255760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b6001600760008560048151811061093e5761093e613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360048151811061099f5761099f613de8565b60200260200101516040516109b691815260200190565b60405180910390a15b60045473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e485856040518363ffffffff1660e01b81526004016109fc929190613d2e565b602060405180830381865afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613dc6565b610a895760405162461bcd60e51b815260206004820152601a60248201527f73706c6974206a6f696e207a6b2070726f6f66206661696c65640000000000006044820152606401610596565b7ff234da3258dbf8e5a4e39e1acffc5d2bedbd437738faf277c46c20c6556a0b2e83600481518110610abd57610abd613de8565b6020026020010151604051610ad491815260200190565b60405180910390a1600883600481518110610af157610af1613de8565b602090810291909101810151825460018101845560009384529190922001558251610b369084906004908110610b2957610b29613de8565b602002602001015161176a565b508115610bef576003546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af1158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613dc6565b50610ce8565b600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c5085600281518110610c4357610c43613de8565b6020026020010151611971565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190613dc6565b505b50505050565b600081610cfd57506000919050565b60035463ffffffff16805b63ffffffff808216600090815260026020526040902054610d2c9186919061176616565b15610d3b575060019392505050565b8063ffffffff16600003610d4d5750601e5b80610d5781613e46565b9150508163ffffffff168163ffffffff1603610d08575060009392505050565b610d82838383611589565b505050565b600081600003610d9957506000919050565b81600103610dc857507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b81600203610df757507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b81600303610e2657507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403610e5557507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503610e8457507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b81600603610eb357507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b81600703610ee257507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b81600803610f1157507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903610f4057507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03610f6f57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b03610f9e57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c03610fcd57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d03610ffc57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e0361102b57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f0361105a57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b8160100361108957507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036110b857507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036110e757507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b8160130361111657507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b8160140361114557507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b8160150361117457507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036111a357507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036111d257507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b8160180361120157507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b8160190361123057507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a0361125f57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b0361128e57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036112bd57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036112ec57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e0361131b57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f0361134a57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b8160200361137957507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610596565b919050565b60006113d38383306119db565b9392505050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061141057611410613de8565b602002602001018181525050919050565b60008061143883604051806020016104a2906139a2565b9050803b600081900361158257600060405180602001611457906139a2565b6020820181038252601f19601f8201166040525090506000858251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115045760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574466163746f72793a206661696c656420746f206465706c6f792060448201527f77616c6c657400000000000000000000000000000000000000000000000000006064820152608401610596565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461157f5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574466163746f72793a206465706c6f79206d69736d6174636800006044820152606401610596565b50505b5092915050565b6040805160028082526060820183526000926020830190803683370190505090506115b384611a05565b816000815181106115c6576115c6613de8565b60200260200101818152505082816001815181106115e6576115e6613de8565b602090810291909101015260065473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e483836040518363ffffffff1660e01b815260040161162e929190613d2e565b602060405180830381865afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190613dc6565b6116bb5760405162461bcd60e51b815260206004820152601460248201527f6e6f7465207a6b2070726f6f66206661696c65640000000000000000000000006044820152606401610596565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301839055610ce68361176a565b600080827f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f800000081111561175b576000611751827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001613e84565b9250925050915091565b600194909350915050565b1490565b60035460008054909163ffffffff64010000000090910481169161179091166002613fa8565b63ffffffff168163ffffffff16036118105760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201527f7665732063616e206265206164646564000000000000000000000000000000006064820152608401610596565b8083600080805b60005463ffffffff90811690821610156118b157611836600286613fec565b63ffffffff16600003611874578392506118558163ffffffff16610d87565b63ffffffff821660009081526001602052604090208590559150611890565b63ffffffff811660009081526001602052604090205492508391505b61189a8383611a0f565b93506118a760028661400f565b9450600101611817565b50600354600090601e906118cc9063ffffffff166001614032565b6118d69190613fec565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff831690811790915560009081526002602052604090208590559050611927866001614032565b6003805463ffffffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905550939695505050505050565b60007401000000000000000000000000000000000000000082106119d75760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b5090565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b806113c181611a91565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110611a4857611a48613de8565b6020026020010181815250508281600181518110611a6857611a68613de8565b602002602001018181525050611a89611a7f611b03565b82600260006130f3565b949350505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110611b005760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b50565b611b0b6139af565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b60008061310a613104865160401b90565b87613179565b905060005b8551811015613154578481101561314c5761314c86828151811061313557613135613de8565b60200260200101518361321b90919063ffffffff16565b60010161310f565b5082156131665761316681600161321b565b61316f816132cd565b9695505050505050565b6131816139d4565b60006040518060c0016040528085815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060800160405280600081526020016000815260200160008152602001600081525081526020016000815260200160001515815260200184815250905083816040015160036004811061320f5761320f613de8565b60200201529392505050565b8160800151158015613231575060038260600151145b156132505761323f8261340c565b506020820151526001606090910152565b816080015115801561326757506003826060015114155b156132a85780826020015183606001516003811061328757613287613de8565b6020020152606082018051600191906132a190839061404f565b9052505050565b8160800151156132c957602082015181905260016060830152600060808301525b5050565b6000816080015180156132e257506060820151155b156132f65760006080830181905260608301525b816080015161336357600061330a8361340c565b60016080850152905060005b60038110156133595781816003811061333157613331613de8565b60200201518460200151826003811061334c5761334c613de8565b6020020152600101613316565b5050600360608301525b60208201515160015b60038110156133cc5783606001518110156133c4578360200151816003811061339757613397613de8565b602002015184602001516001836133ae9190613e84565b600381106133be576133be613de8565b60200201525b60010161336c565b506001836060018181516133e09190613e84565b90525060208301516060840151600091906003811061340157613401613de8565b602002015292915050565b613414613a16565b60005b600381101561345157826060015181106134495760008360200151826003811061344357613443613de8565b60200201525b600101613417565b5060005b60038110156134c05761349d8360200151826003811061347757613477613de8565b60200201518460400151836004811061349257613492613de8565b602002015190613548565b836040015182600481106134b3576134b3613de8565b6020020152600101613455565b506134e082604001518360a00151600001518460a0015160200151613575565b6040808401919091528051606081018252600080825260208201819052918101829052905b6003811015611582578360400151816004811061352457613524613de8565b602002015182826003811061353b5761353b613de8565b6020020152600101613505565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b61357d613a34565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156135e8578581600481106135c4576135c4613de8565b60200201518282600481106135db576135db613de8565b60200201526001016135a9565b506135f2816136e3565b600061360060026008614062565b905060005b81811015613632576136188386836137dd565b6136218361384a565b61362a836136e3565b600101613605565b50600061364060388361404f565b9050815b818110156136965761366f86826040811061366157613661613de8565b602002015151856000613492565b84526136828460005b602002015161388a565b845261368e84886138ad565b600101613644565b5060006136a56038600861404f565b9050815b818110156136d6576136bc8588836137dd565b6136c58561384a565b6136ce856136e3565b6001016136a9565b5092979650505050505050565b60006136f88260016020020151836000613492565b9050600061370f8360036020020151846002613492565b905060006137268460016020020151856001613492565b90506137328183613548565b905060006137498560036020020151866003613492565b90506137558185613548565b905060006137638480613548565b905061376f8180613548565b905061377b8183613548565b905060006137898680613548565b90506137958180613548565b90506137a18185613548565b905060006137af8483613548565b905060006137bd8685613548565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015610ce85761382b8383604081106137fe576137fe613de8565b6020020151826004811061381457613814613de8565b602002015185836004811061349257613492613de8565b84826004811061383d5761383d613de8565b60200201526001016137e0565b60005b60048110156132c95761386b82826004811061367857613678613de8565b82826004811061387d5761387d613de8565b602002015260010161384d565b6000806138978380613975565b90506113d3836138a78380613975565b90613975565b6000805b60048110156138e5576138db8482600481106138cf576138cf613de8565b60200201518390613548565b91506001016138b1565b5060005b6004811015610ce85761392983826004811061390757613907613de8565b602002015185836004811061391e5761391e613de8565b602002015190613975565b84826004811061393b5761393b613de8565b60200201526139568285836004811061349257613492613de8565b84826004811061396857613968613de8565b60200201526001016138e9565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b6105258061407783390190565b60405180604001604052806139c2613a34565b81526020016139cf613a52565b905290565b6040518060c00160405280600081526020016139ee613a16565b81526020016139fb613a34565b815260006020820181905260408201526060016139cf6139af565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b613a6a613a34565b815260200190600190039081613a625790505090565b600060208284031215613a9257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613af157613af1613a99565b604052919050565b600082601f830112613b0a57600080fd5b813567ffffffffffffffff811115613b2457613b24613a99565b613b376020601f19601f84011601613ac8565b818152846020838601011115613b4c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b8257600080fd5b863573ffffffffffffffffffffffffffffffffffffffff81168114613ba657600080fd5b95506020870135945060408701359350606087013567ffffffffffffffff80821115613bd157600080fd5b613bdd8a838b01613af9565b94506080890135935060a0890135915080821115613bfa57600080fd5b50613c0789828a01613af9565b9150509295509295509295565b60008060408385031215613c2757600080fd5b823567ffffffffffffffff80821115613c3f57600080fd5b613c4b86838701613af9565b9350602091508185013581811115613c6257600080fd5b8501601f81018713613c7357600080fd5b803582811115613c8557613c85613a99565b8060051b9250613c96848401613ac8565b8181529282018401928481019089851115613cb057600080fd5b928501925b84841015613cce57833582529285019290850190613cb5565b8096505050505050509250929050565b600080600060608486031215613cf357600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613d1857600080fd5b613d2486828701613af9565b9150509250925092565b604081526000835180604084015260005b81811015613d5c5760208187018101516060868401015201613d3f565b50600060608285010152601f19601f820116830190506060810160206060858403016020860152818651808452608085019150602088019450600093505b80841015613dba5784518252938201936001939093019290820190613d9a565b50979650505050505050565b600060208284031215613dd857600080fd5b815180151581146113d357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff821680613e5c57613e5c613e17565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b818103818111156104c2576104c2613e17565b600181815b80851115613ed4578163ffffffff04821115613eba57613eba613e17565b80851615613ec757918102915b93841c9390800290613e9c565b509250929050565b600082613eeb575060016104c2565b81613ef8575060006104c2565b8160018114613f0e5760028114613f1857613f49565b60019150506104c2565b60ff841115613f2957613f29613e17565b6001841b915063ffffffff821115613f4357613f43613e17565b506104c2565b5060208310610133831016604e8410600b8410161715613f80575081810a63ffffffff811115613f7b57613f7b613e17565b6104c2565b613f8a8383613e97565b8063ffffffff04821115613fa057613fa0613e17565b029392505050565b600063ffffffff611a89818516828516613edc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff8084168061400357614003613fbd565b92169190910692915050565b600063ffffffff8084168061402657614026613fbd565b92169190910492915050565b63ffffffff81811683821601908082111561158257611582613e17565b808201808211156104c2576104c2613e17565b60008261407157614071613fbd565b50049056fe608060405234801561001057600080fd5b50600080546001600160a01b031916331790556104f3806100326000396000f3fe6080604052600436106100385760003560e01c806302cba7411461004457806316f0115b146100795780636dbf2fa0146100cb57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b5061006461005f366004610343565b6100f9565b60405190151581526020015b60405180910390f35b34801561008557600080fd5b506000546100a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610070565b3480156100d757600080fd5b506100eb6100e6366004610384565b610221565b60405161007092919061040d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f7279000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190610484565b949350505050565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f727900000000000000000000000000000000000000006044820152606401610177565b8573ffffffffffffffffffffffffffffffffffffffff168585856040516102ce9291906104ad565b60006040518083038185875af1925050503d806000811461030b576040519150601f19603f3d011682016040523d82523d6000602084013e610310565b606091505b509097909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461034057600080fd5b50565b60008060006060848603121561035857600080fd5b83356103638161031e565b925060208401356103738161031e565b929592945050506040919091013590565b6000806000806060858703121561039a57600080fd5b84356103a58161031e565b935060208501359250604085013567ffffffffffffffff808211156103c957600080fd5b818701915087601f8301126103dd57600080fd5b8135818111156103ec57600080fd5b8860208285010111156103fe57600080fd5b95989497505060200194505050565b82151581526000602060406020840152835180604085015260005b8181101561044457858101830151858201606001528201610428565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b60006020828403121561049657600080fd5b815180151581146104a657600080fd5b9392505050565b818382376000910190815291905056fea264697066735822122077d983d5508d9e74f5dae069d8f0aecc88f28aca3bd682f0f947621364292a9b64736f6c63430008180033a2646970667358221220ee6da2c5d6480ae3f7b23516a9047af64a4cb73eb22cae0ddef8918b8d20f56564736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806390eeb02b116100e3578063c2b40ae41161008c578063e829558811610066578063e8295588146103f4578063f178e47c14610407578063fc7e9c6f1461042757600080fd5b8063c2b40ae4146103ac578063cd87a3b4146103cc578063e40af72e146103d457600080fd5b8063a6232a93116100bd578063a6232a9314610369578063aa0b7db71461037c578063ba70f7571461038f57600080fd5b806390eeb02b1461033157806395d1d7c71461034157806398754e0a1461035657600080fd5b8063404c8149116101455780634ecf518b1161011f5780634ecf518b146102c65780635ed86d5c146102eb578063738133dc146102fe57600080fd5b8063404c8149146102655780634b8ecb0e146102785780634c5eb6761461029f57600080fd5b806329648a971161017657806329648a97146101f257806329a2b3cf146102195780633e413bee1461023957600080fd5b80631202471514610192578063257671f5146101dc575b600080fd5b6004546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101e461043f565b6040519081526020016101d3565b6101e47f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb281565b6006546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6003546101b29068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610273366004613a80565b61046c565b6101e47f087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf81565b6101e47f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a81565b6000546102d69063ffffffff1681565b60405163ffffffff90911681526020016101d3565b6101b26102f9366004613a80565b61048d565b61032161030c366004613a80565b60076020526000908152604090205460ff1681565b60405190151581526020016101d3565b6003546102d69063ffffffff1681565b61035461034f366004613b69565b6104c8565b005b610354610364366004613c14565b610662565b610321610377366004613a80565b610cee565b61035461038a366004613cde565b610d77565b60035463ffffffff166000908152600260205260409020546101e4565b6101e46103ba366004613a80565b60026020526000908152604090205481565b6102d6601e81565b6005546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610402366004613a80565b610d87565b6101e4610415366004613a80565b60016020526000908152604090205481565b6003546102d690640100000000900463ffffffff1681565b60405161044e602082016139a2565b6020820181038252601f19601f820116604052508051906020012081565b6008818154811061047c57600080fd5b600091825260209091200154905081565b60006104c2826040516104a2602082016139a2565b6020820181038252601f19601f82011660405250805190602001206113c6565b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e4846104f0876113da565b6040518363ffffffff1660e01b815260040161050d929190613d2e565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e9190613dc6565b61059f5760405162461bcd60e51b815260206004820152601560248201527f6861736832207a6b2070726f6f66206661696c6564000000000000000000000060448201526064015b60405180910390fd5b60006105aa85611421565b6040517f02cba74100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015230602483015260448201899052919250908216906302cba741906064016020604051808303816000875af1158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190613dc6565b50610659868484611589565b50505050505050565b6106858160008151811061067857610678613de8565b6020026020010151610cee565b6106d15760405162461bcd60e51b815260206004820152601560248201527f4465706f7369747320726f6f7420756e6b6e6f776e00000000000000000000006044820152606401610596565b6000806106f7836001815181106106ea576106ea613de8565b60200260200101516116f9565b915091506107487f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460038151811061073257610732613de8565b602002602001015161176690919063ffffffff16565b61086857600760008460038151811061076357610763613de8565b60209081029190910181015182528101919091526040016000205460ff16156107ce5760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b600160076000856003815181106107e7576107e7613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360038151811061084857610848613de8565b602002602001015160405161085f91815260200190565b60405180910390a15b61089f7f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460048151811061073257610732613de8565b6109bf5760076000846004815181106108ba576108ba613de8565b60209081029190910181015182528101919091526040016000205460ff16156109255760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b6001600760008560048151811061093e5761093e613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360048151811061099f5761099f613de8565b60200260200101516040516109b691815260200190565b60405180910390a15b60045473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e485856040518363ffffffff1660e01b81526004016109fc929190613d2e565b602060405180830381865afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613dc6565b610a895760405162461bcd60e51b815260206004820152601a60248201527f73706c6974206a6f696e207a6b2070726f6f66206661696c65640000000000006044820152606401610596565b7ff234da3258dbf8e5a4e39e1acffc5d2bedbd437738faf277c46c20c6556a0b2e83600481518110610abd57610abd613de8565b6020026020010151604051610ad491815260200190565b60405180910390a1600883600481518110610af157610af1613de8565b602090810291909101810151825460018101845560009384529190922001558251610b369084906004908110610b2957610b29613de8565b602002602001015161176a565b508115610bef576003546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af1158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613dc6565b50610ce8565b600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c5085600281518110610c4357610c43613de8565b6020026020010151611971565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190613dc6565b505b50505050565b600081610cfd57506000919050565b60035463ffffffff16805b63ffffffff808216600090815260026020526040902054610d2c9186919061176616565b15610d3b575060019392505050565b8063ffffffff16600003610d4d5750601e5b80610d5781613e46565b9150508163ffffffff168163ffffffff1603610d08575060009392505050565b610d82838383611589565b505050565b600081600003610d9957506000919050565b81600103610dc857507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b81600203610df757507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b81600303610e2657507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403610e5557507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503610e8457507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b81600603610eb357507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b81600703610ee257507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b81600803610f1157507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903610f4057507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03610f6f57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b03610f9e57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c03610fcd57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d03610ffc57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e0361102b57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f0361105a57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b8160100361108957507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036110b857507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036110e757507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b8160130361111657507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b8160140361114557507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b8160150361117457507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036111a357507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036111d257507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b8160180361120157507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b8160190361123057507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a0361125f57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b0361128e57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036112bd57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036112ec57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e0361131b57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f0361134a57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b8160200361137957507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610596565b919050565b60006113d38383306119db565b9392505050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061141057611410613de8565b602002602001018181525050919050565b60008061143883604051806020016104a2906139a2565b9050803b600081900361158257600060405180602001611457906139a2565b6020820181038252601f19601f8201166040525090506000858251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115045760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574466163746f72793a206661696c656420746f206465706c6f792060448201527f77616c6c657400000000000000000000000000000000000000000000000000006064820152608401610596565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461157f5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574466163746f72793a206465706c6f79206d69736d6174636800006044820152606401610596565b50505b5092915050565b6040805160028082526060820183526000926020830190803683370190505090506115b384611a05565b816000815181106115c6576115c6613de8565b60200260200101818152505082816001815181106115e6576115e6613de8565b602090810291909101015260065473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e483836040518363ffffffff1660e01b815260040161162e929190613d2e565b602060405180830381865afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190613dc6565b6116bb5760405162461bcd60e51b815260206004820152601460248201527f6e6f7465207a6b2070726f6f66206661696c65640000000000000000000000006044820152606401610596565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301839055610ce68361176a565b600080827f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f800000081111561175b576000611751827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001613e84565b9250925050915091565b600194909350915050565b1490565b60035460008054909163ffffffff64010000000090910481169161179091166002613fa8565b63ffffffff168163ffffffff16036118105760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201527f7665732063616e206265206164646564000000000000000000000000000000006064820152608401610596565b8083600080805b60005463ffffffff90811690821610156118b157611836600286613fec565b63ffffffff16600003611874578392506118558163ffffffff16610d87565b63ffffffff821660009081526001602052604090208590559150611890565b63ffffffff811660009081526001602052604090205492508391505b61189a8383611a0f565b93506118a760028661400f565b9450600101611817565b50600354600090601e906118cc9063ffffffff166001614032565b6118d69190613fec565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff831690811790915560009081526002602052604090208590559050611927866001614032565b6003805463ffffffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905550939695505050505050565b60007401000000000000000000000000000000000000000082106119d75760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b5090565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b806113c181611a91565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110611a4857611a48613de8565b6020026020010181815250508281600181518110611a6857611a68613de8565b602002602001018181525050611a89611a7f611b03565b82600260006130f3565b949350505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110611b005760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b50565b611b0b6139af565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b60008061310a613104865160401b90565b87613179565b905060005b8551811015613154578481101561314c5761314c86828151811061313557613135613de8565b60200260200101518361321b90919063ffffffff16565b60010161310f565b5082156131665761316681600161321b565b61316f816132cd565b9695505050505050565b6131816139d4565b60006040518060c0016040528085815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060800160405280600081526020016000815260200160008152602001600081525081526020016000815260200160001515815260200184815250905083816040015160036004811061320f5761320f613de8565b60200201529392505050565b8160800151158015613231575060038260600151145b156132505761323f8261340c565b506020820151526001606090910152565b816080015115801561326757506003826060015114155b156132a85780826020015183606001516003811061328757613287613de8565b6020020152606082018051600191906132a190839061404f565b9052505050565b8160800151156132c957602082015181905260016060830152600060808301525b5050565b6000816080015180156132e257506060820151155b156132f65760006080830181905260608301525b816080015161336357600061330a8361340c565b60016080850152905060005b60038110156133595781816003811061333157613331613de8565b60200201518460200151826003811061334c5761334c613de8565b6020020152600101613316565b5050600360608301525b60208201515160015b60038110156133cc5783606001518110156133c4578360200151816003811061339757613397613de8565b602002015184602001516001836133ae9190613e84565b600381106133be576133be613de8565b60200201525b60010161336c565b506001836060018181516133e09190613e84565b90525060208301516060840151600091906003811061340157613401613de8565b602002015292915050565b613414613a16565b60005b600381101561345157826060015181106134495760008360200151826003811061344357613443613de8565b60200201525b600101613417565b5060005b60038110156134c05761349d8360200151826003811061347757613477613de8565b60200201518460400151836004811061349257613492613de8565b602002015190613548565b836040015182600481106134b3576134b3613de8565b6020020152600101613455565b506134e082604001518360a00151600001518460a0015160200151613575565b6040808401919091528051606081018252600080825260208201819052918101829052905b6003811015611582578360400151816004811061352457613524613de8565b602002015182826003811061353b5761353b613de8565b6020020152600101613505565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b61357d613a34565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156135e8578581600481106135c4576135c4613de8565b60200201518282600481106135db576135db613de8565b60200201526001016135a9565b506135f2816136e3565b600061360060026008614062565b905060005b81811015613632576136188386836137dd565b6136218361384a565b61362a836136e3565b600101613605565b50600061364060388361404f565b9050815b818110156136965761366f86826040811061366157613661613de8565b602002015151856000613492565b84526136828460005b602002015161388a565b845261368e84886138ad565b600101613644565b5060006136a56038600861404f565b9050815b818110156136d6576136bc8588836137dd565b6136c58561384a565b6136ce856136e3565b6001016136a9565b5092979650505050505050565b60006136f88260016020020151836000613492565b9050600061370f8360036020020151846002613492565b905060006137268460016020020151856001613492565b90506137328183613548565b905060006137498560036020020151866003613492565b90506137558185613548565b905060006137638480613548565b905061376f8180613548565b905061377b8183613548565b905060006137898680613548565b90506137958180613548565b90506137a18185613548565b905060006137af8483613548565b905060006137bd8685613548565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015610ce85761382b8383604081106137fe576137fe613de8565b6020020151826004811061381457613814613de8565b602002015185836004811061349257613492613de8565b84826004811061383d5761383d613de8565b60200201526001016137e0565b60005b60048110156132c95761386b82826004811061367857613678613de8565b82826004811061387d5761387d613de8565b602002015260010161384d565b6000806138978380613975565b90506113d3836138a78380613975565b90613975565b6000805b60048110156138e5576138db8482600481106138cf576138cf613de8565b60200201518390613548565b91506001016138b1565b5060005b6004811015610ce85761392983826004811061390757613907613de8565b602002015185836004811061391e5761391e613de8565b602002015190613975565b84826004811061393b5761393b613de8565b60200201526139568285836004811061349257613492613de8565b84826004811061396857613968613de8565b60200201526001016138e9565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b6105258061407783390190565b60405180604001604052806139c2613a34565b81526020016139cf613a52565b905290565b6040518060c00160405280600081526020016139ee613a16565b81526020016139fb613a34565b815260006020820181905260408201526060016139cf6139af565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b613a6a613a34565b815260200190600190039081613a625790505090565b600060208284031215613a9257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613af157613af1613a99565b604052919050565b600082601f830112613b0a57600080fd5b813567ffffffffffffffff811115613b2457613b24613a99565b613b376020601f19601f84011601613ac8565b818152846020838601011115613b4c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b8257600080fd5b863573ffffffffffffffffffffffffffffffffffffffff81168114613ba657600080fd5b95506020870135945060408701359350606087013567ffffffffffffffff80821115613bd157600080fd5b613bdd8a838b01613af9565b94506080890135935060a0890135915080821115613bfa57600080fd5b50613c0789828a01613af9565b9150509295509295509295565b60008060408385031215613c2757600080fd5b823567ffffffffffffffff80821115613c3f57600080fd5b613c4b86838701613af9565b9350602091508185013581811115613c6257600080fd5b8501601f81018713613c7357600080fd5b803582811115613c8557613c85613a99565b8060051b9250613c96848401613ac8565b8181529282018401928481019089851115613cb057600080fd5b928501925b84841015613cce57833582529285019290850190613cb5565b8096505050505050509250929050565b600080600060608486031215613cf357600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613d1857600080fd5b613d2486828701613af9565b9150509250925092565b604081526000835180604084015260005b81811015613d5c5760208187018101516060868401015201613d3f565b50600060608285010152601f19601f820116830190506060810160206060858403016020860152818651808452608085019150602088019450600093505b80841015613dba5784518252938201936001939093019290820190613d9a565b50979650505050505050565b600060208284031215613dd857600080fd5b815180151581146113d357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff821680613e5c57613e5c613e17565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b818103818111156104c2576104c2613e17565b600181815b80851115613ed4578163ffffffff04821115613eba57613eba613e17565b80851615613ec757918102915b93841c9390800290613e9c565b509250929050565b600082613eeb575060016104c2565b81613ef8575060006104c2565b8160018114613f0e5760028114613f1857613f49565b60019150506104c2565b60ff841115613f2957613f29613e17565b6001841b915063ffffffff821115613f4357613f43613e17565b506104c2565b5060208310610133831016604e8410600b8410161715613f80575081810a63ffffffff811115613f7b57613f7b613e17565b6104c2565b613f8a8383613e97565b8063ffffffff04821115613fa057613fa0613e17565b029392505050565b600063ffffffff611a89818516828516613edc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff8084168061400357614003613fbd565b92169190910692915050565b600063ffffffff8084168061402657614026613fbd565b92169190910492915050565b63ffffffff81811683821601908082111561158257611582613e17565b808201808211156104c2576104c2613e17565b60008261407157614071613fbd565b50049056fe608060405234801561001057600080fd5b50600080546001600160a01b031916331790556104f3806100326000396000f3fe6080604052600436106100385760003560e01c806302cba7411461004457806316f0115b146100795780636dbf2fa0146100cb57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b5061006461005f366004610343565b6100f9565b60405190151581526020015b60405180910390f35b34801561008557600080fd5b506000546100a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610070565b3480156100d757600080fd5b506100eb6100e6366004610384565b610221565b60405161007092919061040d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f7279000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190610484565b949350505050565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f727900000000000000000000000000000000000000006044820152606401610177565b8573ffffffffffffffffffffffffffffffffffffffff168585856040516102ce9291906104ad565b60006040518083038185875af1925050503d806000811461030b576040519150601f19603f3d011682016040523d82523d6000602084013e610310565b606091505b509097909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461034057600080fd5b50565b60008060006060848603121561035857600080fd5b83356103638161031e565b925060208401356103738161031e565b929592945050506040919091013590565b6000806000806060858703121561039a57600080fd5b84356103a58161031e565b935060208501359250604085013567ffffffffffffffff808211156103c957600080fd5b818701915087601f8301126103dd57600080fd5b8135818111156103ec57600080fd5b8860208285010111156103fe57600080fd5b95989497505060200194505050565b82151581526000602060406020840152835180604085015260005b8181101561044457858101830151858201606001528201610428565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b60006020828403121561049657600080fd5b815180151581146104a657600080fd5b9392505050565b818382376000910190815291905056fea264697066735822122077d983d5508d9e74f5dae069d8f0aecc88f28aca3bd682f0f947621364292a9b64736f6c63430008180033a2646970667358221220ee6da2c5d6480ae3f7b23516a9047af64a4cb73eb22cae0ddef8918b8d20f56564736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "getLastRoot()": { + "details": "Returns the last root" + }, + "isKnownRoot(uint256)": { + "details": "Whether the root is present in the root history" + }, + "zeros(uint256)": { + "details": "provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels" + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 4217, + "contract": "contracts/Pool.sol:Pool", + "label": "levels", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 4222, + "contract": "contracts/Pool.sol:Pool", + "label": "filledSubtrees", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_userDefinedValueType(Field)5523)" + }, + { + "astId": 4227, + "contract": "contracts/Pool.sol:Pool", + "label": "roots", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_userDefinedValueType(Field)5523)" + }, + { + "astId": 4233, + "contract": "contracts/Pool.sol:Pool", + "label": "currentRootIndex", + "offset": 0, + "slot": "3", + "type": "t_uint32" + }, + { + "astId": 4236, + "contract": "contracts/Pool.sol:Pool", + "label": "nextIndex", + "offset": 4, + "slot": "3", + "type": "t_uint32" + }, + { + "astId": 4875, + "contract": "contracts/Pool.sol:Pool", + "label": "usdc", + "offset": 8, + "slot": "3", + "type": "t_contract(IERC20)729" + }, + { + "astId": 4878, + "contract": "contracts/Pool.sol:Pool", + "label": "splitJoinVerifier", + "offset": 0, + "slot": "4", + "type": "t_contract(SplitJoin16Verifier)5510" + }, + { + "astId": 4881, + "contract": "contracts/Pool.sol:Pool", + "label": "hash2Verifier", + "offset": 0, + "slot": "5", + "type": "t_contract(Hash2Verifier)5516" + }, + { + "astId": 4884, + "contract": "contracts/Pool.sol:Pool", + "label": "noteVerifier", + "offset": 0, + "slot": "6", + "type": "t_contract(NoteVerifier)5519" + }, + { + "astId": 4889, + "contract": "contracts/Pool.sol:Pool", + "label": "isNoteSpent", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_userDefinedValueType(Field)5523,t_bool)" + }, + { + "astId": 4893, + "contract": "contracts/Pool.sol:Pool", + "label": "noteCommitments", + "offset": 0, + "slot": "8", + "type": "t_array(t_userDefinedValueType(Field)5523)dyn_storage" + } + ], + "types": { + "t_array(t_userDefinedValueType(Field)5523)dyn_storage": { + "base": "t_userDefinedValueType(Field)5523", + "encoding": "dynamic_array", + "label": "Field[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(Hash2Verifier)5516": { + "encoding": "inplace", + "label": "contract Hash2Verifier", + "numberOfBytes": "20" + }, + "t_contract(IERC20)729": { + "encoding": "inplace", + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(NoteVerifier)5519": { + "encoding": "inplace", + "label": "contract NoteVerifier", + "numberOfBytes": "20" + }, + "t_contract(SplitJoin16Verifier)5510": { + "encoding": "inplace", + "label": "contract SplitJoin16Verifier", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_userDefinedValueType(Field)5523)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => Field)", + "numberOfBytes": "32", + "value": "t_userDefinedValueType(Field)5523" + }, + "t_mapping(t_userDefinedValueType(Field)5523,t_bool)": { + "encoding": "mapping", + "key": "t_userDefinedValueType(Field)5523", + "label": "mapping(Field => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_userDefinedValueType(Field)5523": { + "encoding": "inplace", + "label": "Field", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/src/contracts/deployments/arbsep/SplitJoin16Verifier.json b/src/contracts/deployments/arbsep/SplitJoin16Verifier.json new file mode 100644 index 0000000..cd7dc6d --- /dev/null +++ b/src/contracts/deployments/arbsep/SplitJoin16Verifier.json @@ -0,0 +1,148 @@ +{ + "address": "0x4298B6a7E18A55996697DDD009BbD5BeEADF199F", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x06f8988fc8e92d8d65df08638e5b687208c4b0ceb74ec20fd72b2d2743a9a3a2", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0x4298B6a7E18A55996697DDD009BbD5BeEADF199F", + "transactionIndex": 1, + "gasUsed": "3954195", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x4c648296f74b3ed1be7aa0244f0055364ce65fa03d6f8d1e5b7ebfc3c19adf7f", + "transactionHash": "0x06f8988fc8e92d8d65df08638e5b687208c4b0ceb74ec20fd72b2d2743a9a3a2", + "logs": [], + "blockNumber": 23808608, + "cumulativeGasUsed": "3954195", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"SplitJoin16Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af457637e5769bf60e01b60005260046000fd5b5050612ceb80610b056000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed381526020015b60405180910390f35b61008161007c366004612bf0565b610091565b6040519015158152602001610065565b6180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300526103a0518281146108a0576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1b576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d15577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edb57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9c565b50505080610f0d577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f49578483840992508001610f34565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f80578483840992508001610f6b565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611076577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce7576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d21576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d82576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de3576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e47576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eaf576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f17576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7f576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe7576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204f576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b7576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128af577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e5576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612943576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa45761340051613420518582830986600388838609088783840914612a00576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4e576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad4577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be2577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0657600080fd5b843567ffffffffffffffff80821115612c1e57600080fd5b818701915087601f830112612c3257600080fd5b813581811115612c4157600080fd5b886020828501011115612c5357600080fd5b602092830196509450908601359080821115612c6e57600080fd5b818701915087601f830112612c8257600080fd5b813581811115612c9157600080fd5b8860208260051b8501011115612ca657600080fd5b9598949750506020019450505056fea2646970667358221220fe40f32326550f06de5c9e39eae7c73c13c432d89867bf72e452efe813956e1864736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed381526020015b60405180910390f35b61008161007c366004612bf0565b610091565b6040519015158152602001610065565b6180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300526103a0518281146108a0576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1b576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d15577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edb57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9c565b50505080610f0d577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f49578483840992508001610f34565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f80578483840992508001610f6b565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611076577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce7576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d21576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d82576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de3576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e47576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eaf576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f17576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7f576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe7576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204f576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b7576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128af577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e5576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612943576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa45761340051613420518582830986600388838609088783840914612a00576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4e576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad4577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be2577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0657600080fd5b843567ffffffffffffffff80821115612c1e57600080fd5b818701915087601f830112612c3257600080fd5b813581811115612c4157600080fd5b886020828501011115612c5357600080fd5b602092830196509450908601359080821115612c6e57600080fd5b818701915087601f830112612c8257600080fd5b813581811115612c9157600080fd5b8860208260051b8501011115612ca657600080fd5b9598949750506020019450505056fea2646970667358221220fe40f32326550f06de5c9e39eae7c73c13c432d89867bf72e452efe813956e1864736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/arbsep/SplitJoin32Verifier.json b/src/contracts/deployments/arbsep/SplitJoin32Verifier.json new file mode 100644 index 0000000..8783ad8 --- /dev/null +++ b/src/contracts/deployments/arbsep/SplitJoin32Verifier.json @@ -0,0 +1,148 @@ +{ + "address": "0xee68a6ff16Ed0Fdf512b715CfF0aB7ce3D8484Ff", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x2c6062adeeb05bc78f96608527fcbe5b1e4e16c512719d3bfc34fbd8a2a2fc12", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0xee68a6ff16Ed0Fdf512b715CfF0aB7ce3D8484Ff", + "transactionIndex": 2, + "gasUsed": "3952385", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xda928b38e7fab718da45a160d0a4636828e9b76e7361d7944762309d123e698b", + "transactionHash": "0x2c6062adeeb05bc78f96608527fcbe5b1e4e16c512719d3bfc34fbd8a2a2fc12", + "logs": [], + "blockNumber": 23808618, + "cumulativeGasUsed": "4017479", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"SplitJoin32Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af257637e5769bf60e01b60005260046000fd5b5050612ce980610b036000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c207404556581526020015b60405180910390f35b61008161007c366004612bee565b610091565b6040519015158152602001610065565b620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300526103a05182811461089e576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d19576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d13577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ed957823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9a565b50505080610f0b577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f47578483840992508001610f32565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7e578483840992508001610f69565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611074577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce5576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d1f576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d80576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de1576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e45576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611ead576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f15576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7d576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe5576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204d576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b5576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ad577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e3576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612941576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa257613400516134205185828309866003888386090887838409146129fe576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4c576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad2577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be0577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0457600080fd5b843567ffffffffffffffff80821115612c1c57600080fd5b818701915087601f830112612c3057600080fd5b813581811115612c3f57600080fd5b886020828501011115612c5157600080fd5b602092830196509450908601359080821115612c6c57600080fd5b818701915087601f830112612c8057600080fd5b813581811115612c8f57600080fd5b8860208260051b8501011115612ca457600080fd5b9598949750506020019450505056fea264697066735822122034599d6501f9934bf132bf2b4def287def85792f7d861c5909edc7f3e19449cb64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c207404556581526020015b60405180910390f35b61008161007c366004612bee565b610091565b6040519015158152602001610065565b620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300526103a05182811461089e576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d19576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d13577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ed957823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9a565b50505080610f0b577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f47578483840992508001610f32565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7e578483840992508001610f69565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611074577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce5576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d1f576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d80576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de1576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e45576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611ead576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f15576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7d576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe5576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204d576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b5576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ad577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e3576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612941576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa257613400516134205185828309866003888386090887838409146129fe576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4c576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad2577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be0577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0457600080fd5b843567ffffffffffffffff80821115612c1c57600080fd5b818701915087601f830112612c3057600080fd5b813581811115612c3f57600080fd5b886020828501011115612c5157600080fd5b602092830196509450908601359080821115612c6c57600080fd5b818701915087601f830112612c8057600080fd5b813581811115612c8f57600080fd5b8860208260051b8501011115612ca457600080fd5b9598949750506020019450505056fea264697066735822122034599d6501f9934bf132bf2b4def287def85792f7d861c5909edc7f3e19449cb64736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/arbsep/USDC.json b/src/contracts/deployments/arbsep/USDC.json new file mode 100644 index 0000000..5574a80 --- /dev/null +++ b/src/contracts/deployments/arbsep/USDC.json @@ -0,0 +1,530 @@ +{ + "address": "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x96e9b9dfc25440d088899ecb283d9e8840154b7ccd22b60e5d499d320e93de18", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8", + "transactionIndex": 1, + "gasUsed": "1040616", + "logsBloom": "0x00000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000002000000001000000000010000000000000000000000000000000020000000000000000000000000400000000000000000000000000000000000000000", + "blockHash": "0x112cd8cd247e18daa5f86386e1e04c2a9c03e16a42628002aaf36e0275622d2f", + "transactionHash": "0x96e9b9dfc25440d088899ecb283d9e8840154b7ccd22b60e5d499d320e93de18", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 23808598, + "transactionHash": "0x96e9b9dfc25440d088899ecb283d9e8840154b7ccd22b60e5d499d320e93de18", + "address": "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000087ccb20c6c213035e5aa15efd173d39ca46d95a4" + ], + "data": "0x00000000000000000000000000000000000000000000000000038d7ea4c68000", + "logIndex": 0, + "blockHash": "0x112cd8cd247e18daa5f86386e1e04c2a9c03e16a42628002aaf36e0275622d2f" + } + ], + "blockNumber": 23808598, + "cumulativeGasUsed": "1040616", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/USDC.sol\":\"USDC\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC20Metadata} from \\\"./extensions/IERC20Metadata.sol\\\";\\nimport {Context} from \\\"../../utils/Context.sol\\\";\\nimport {IERC20Errors} from \\\"../../interfaces/draft-IERC6093.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * The default value of {decimals} is 18. To change this, you should override\\n * this function so it returns a different value.\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n */\\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\\n mapping(address account => uint256) private _balances;\\n\\n mapping(address account => mapping(address spender => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the default value returned by this function, unless\\n * it's overridden.\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `value`.\\n */\\n function transfer(address to, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, value);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, value);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `value`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `value`.\\n */\\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, value);\\n _transfer(from, to, value);\\n return true;\\n }\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * NOTE: This function is not virtual, {_update} should be overridden instead.\\n */\\n function _transfer(address from, address to, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n if (to == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(from, to, value);\\n }\\n\\n /**\\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\\n * this function.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _update(address from, address to, uint256 value) internal virtual {\\n if (from == address(0)) {\\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\\n _totalSupply += value;\\n } else {\\n uint256 fromBalance = _balances[from];\\n if (fromBalance < value) {\\n revert ERC20InsufficientBalance(from, fromBalance, value);\\n }\\n unchecked {\\n // Overflow not possible: value <= fromBalance <= totalSupply.\\n _balances[from] = fromBalance - value;\\n }\\n }\\n\\n if (to == address(0)) {\\n unchecked {\\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\\n _totalSupply -= value;\\n }\\n } else {\\n unchecked {\\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\\n _balances[to] += value;\\n }\\n }\\n\\n emit Transfer(from, to, value);\\n }\\n\\n /**\\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\\n * Relies on the `_update` mechanism\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * NOTE: This function is not virtual, {_update} should be overridden instead.\\n */\\n function _mint(address account, uint256 value) internal {\\n if (account == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(address(0), account, value);\\n }\\n\\n /**\\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\\n * Relies on the `_update` mechanism.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * NOTE: This function is not virtual, {_update} should be overridden instead\\n */\\n function _burn(address account, uint256 value) internal {\\n if (account == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n _update(account, address(0), value);\\n }\\n\\n /**\\n * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n *\\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\\n */\\n function _approve(address owner, address spender, uint256 value) internal {\\n _approve(owner, spender, value, true);\\n }\\n\\n /**\\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\\n *\\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\\n * `Approval` event during `transferFrom` operations.\\n *\\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\\n * true using the following override:\\n * ```\\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\\n * super._approve(owner, spender, value, true);\\n * }\\n * ```\\n *\\n * Requirements are the same as {_approve}.\\n */\\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\\n if (owner == address(0)) {\\n revert ERC20InvalidApprover(address(0));\\n }\\n if (spender == address(0)) {\\n revert ERC20InvalidSpender(address(0));\\n }\\n _allowances[owner][spender] = value;\\n if (emitEvent) {\\n emit Approval(owner, spender, value);\\n }\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `value`.\\n *\\n * Does not update the allowance value in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Does not emit an {Approval} event.\\n */\\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n if (currentAllowance < value) {\\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\\n }\\n unchecked {\\n _approve(owner, spender, currentAllowance - value, false);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/USDC.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {ERC20} from \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\ncontract USDC is ERC20 {\\n constructor() ERC20(\\\"USDC\\\", \\\"USDC\\\") {\\n _mint(msg.sender, 1_000_000_000e6);\\n }\\n\\n function decimals() public view virtual override returns (uint8) {\\n return 6;\\n }\\n}\\n\",\"keccak256\":\"0x81c8f6239539342ac8f8e29f41aff8b6d027f233095f9880c8657e890fc5fdc5\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040805180820182526004808252635553444360e01b60208084018290528451808601909552918452908301529060036200004e83826200029b565b5060046200005d82826200029b565b505050620000793366038d7ea4c680006200007f60201b60201c565b6200038f565b6001600160a01b038216620000af5760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000bd60008383620000c1565b5050565b6001600160a01b038316620000f0578060026000828254620000e4919062000367565b90915550620001649050565b6001600160a01b03831660009081526020819052604090205481811015620001455760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000a6565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166200018257600280548290039055620001a1565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620001e791815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021f57607f821691505b6020821081036200024057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000296576000816000526020600020601f850160051c81016020861015620002715750805b601f850160051c820191505b8181101562000292578281556001016200027d565b5050505b505050565b81516001600160401b03811115620002b757620002b7620001f4565b620002cf81620002c884546200020a565b8462000246565b602080601f831160018114620003075760008415620002ee5750858301515b600019600386901b1c1916600185901b17855562000292565b600085815260208120601f198616915b82811015620003385788860151825594840194600190910190840162000317565b5085821015620003575787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200038957634e487b7160e01b600052601160045260246000fd5b92915050565b610939806200039f6000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063313ce5671161007657806395d89b411161005b57806395d89b4114610153578063a9059cbb1461015b578063dd62ed3e1461016e57600080fd5b8063313ce5671461010e57806370a082311461011d57600080fd5b806306fdde03146100a8578063095ea7b3146100c657806318160ddd146100e957806323b872dd146100fb575b600080fd5b6100b06101b4565b6040516100bd9190610725565b60405180910390f35b6100d96100d43660046107bb565b610246565b60405190151581526020016100bd565b6002545b6040519081526020016100bd565b6100d96101093660046107e5565b610260565b604051600681526020016100bd565b6100ed61012b366004610821565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100b0610284565b6100d96101693660046107bb565b610293565b6100ed61017c366004610843565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101c390610876565b80601f01602080910402602001604051908101604052809291908181526020018280546101ef90610876565b801561023c5780601f106102115761010080835404028352916020019161023c565b820191906000526020600020905b81548152906001019060200180831161021f57829003601f168201915b5050505050905090565b6000336102548185856102a1565b60019150505b92915050565b60003361026e8582856102b3565b610279858585610387565b506001949350505050565b6060600480546101c390610876565b600033610254818585610387565b6102ae8383836001610432565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103815781811015610372576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b61038184848484036000610432565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166103d7576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff8216610427576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b6102ae83838361057a565b73ffffffffffffffffffffffffffffffffffffffff8416610482576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff83166104d2576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015610381578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056c91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166105b25780600260008282546105a791906108c9565b909155506106649050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610638576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610369565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661068d576002805482900390556106b9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071891815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b8181101561075357858101830151858201604001528201610737565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b919050565b600080604083850312156107ce57600080fd5b6107d783610792565b946020939093013593505050565b6000806000606084860312156107fa57600080fd5b61080384610792565b925061081160208501610792565b9150604084013590509250925092565b60006020828403121561083357600080fd5b61083c82610792565b9392505050565b6000806040838503121561085657600080fd5b61085f83610792565b915061086d60208401610792565b90509250929050565b600181811c9082168061088a57607f821691505b6020821081036108c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561025a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220ce818a16e5ef8eb5cef5c8c5740e70f324205a3969fb9d7a5b19bd4a74af278464736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063313ce5671161007657806395d89b411161005b57806395d89b4114610153578063a9059cbb1461015b578063dd62ed3e1461016e57600080fd5b8063313ce5671461010e57806370a082311461011d57600080fd5b806306fdde03146100a8578063095ea7b3146100c657806318160ddd146100e957806323b872dd146100fb575b600080fd5b6100b06101b4565b6040516100bd9190610725565b60405180910390f35b6100d96100d43660046107bb565b610246565b60405190151581526020016100bd565b6002545b6040519081526020016100bd565b6100d96101093660046107e5565b610260565b604051600681526020016100bd565b6100ed61012b366004610821565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100b0610284565b6100d96101693660046107bb565b610293565b6100ed61017c366004610843565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101c390610876565b80601f01602080910402602001604051908101604052809291908181526020018280546101ef90610876565b801561023c5780601f106102115761010080835404028352916020019161023c565b820191906000526020600020905b81548152906001019060200180831161021f57829003601f168201915b5050505050905090565b6000336102548185856102a1565b60019150505b92915050565b60003361026e8582856102b3565b610279858585610387565b506001949350505050565b6060600480546101c390610876565b600033610254818585610387565b6102ae8383836001610432565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103815781811015610372576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b61038184848484036000610432565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166103d7576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff8216610427576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b6102ae83838361057a565b73ffffffffffffffffffffffffffffffffffffffff8416610482576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff83166104d2576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015610381578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056c91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166105b25780600260008282546105a791906108c9565b909155506106649050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610638576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610369565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661068d576002805482900390556106b9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071891815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b8181101561075357858101830151858201604001528201610737565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b919050565b600080604083850312156107ce57600080fd5b6107d783610792565b946020939093013593505050565b6000806000606084860312156107fa57600080fd5b61080384610792565b925061081160208501610792565b9150604084013590509250925092565b60006020828403121561083357600080fd5b61083c82610792565b9392505050565b6000806040838503121561085657600080fd5b61085f83610792565b915061086d60208401610792565b90509250929050565b600181811c9082168061088a57607f821691505b6020821081036108c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561025a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220ce818a16e5ef8eb5cef5c8c5740e70f324205a3969fb9d7a5b19bd4a74af278464736f6c63430008180033", + "devdoc": { + "errors": { + "ERC20InsufficientAllowance(address,uint256,uint256)": [ + { + "details": "Indicates a failure with the `spender`’s `allowance`. Used in transfers.", + "params": { + "allowance": "Amount of tokens a `spender` is allowed to operate with.", + "needed": "Minimum amount required to perform a transfer.", + "spender": "Address that may be allowed to operate on tokens without being their owner." + } + } + ], + "ERC20InsufficientBalance(address,uint256,uint256)": [ + { + "details": "Indicates an error related to the current `balance` of a `sender`. Used in transfers.", + "params": { + "balance": "Current balance for the interacting account.", + "needed": "Minimum amount required to perform a transfer.", + "sender": "Address whose tokens are being transferred." + } + } + ], + "ERC20InvalidApprover(address)": [ + { + "details": "Indicates a failure with the `approver` of a token to be approved. Used in approvals.", + "params": { + "approver": "Address initiating an approval operation." + } + } + ], + "ERC20InvalidReceiver(address)": [ + { + "details": "Indicates a failure with the token `receiver`. Used in transfers.", + "params": { + "receiver": "Address to which tokens are being transferred." + } + } + ], + "ERC20InvalidSender(address)": [ + { + "details": "Indicates a failure with the token `sender`. Used in transfers.", + "params": { + "sender": "Address whose tokens are being transferred." + } + } + ], + "ERC20InvalidSpender(address)": [ + { + "details": "Indicates a failure with the `spender` to be approved. Used in approvals.", + "params": { + "spender": "Address that may be allowed to operate on tokens without being their owner." + } + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero." + } + }, + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "name()": { + "details": "Returns the name of the token." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 159, + "contract": "contracts/USDC.sol:USDC", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 165, + "contract": "contracts/USDC.sol:USDC", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 167, + "contract": "contracts/USDC.sol:USDC", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 169, + "contract": "contracts/USDC.sol:USDC", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 171, + "contract": "contracts/USDC.sol:USDC", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/src/contracts/deployments/arbsep/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json b/src/contracts/deployments/arbsep/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json new file mode 100644 index 0000000..72df3c5 --- /dev/null +++ b/src/contracts/deployments/arbsep/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json @@ -0,0 +1,93 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n * ```\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Create2.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Create2.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Not enough balance for performing a CREATE2 deploy.\n */\n error Create2InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev There's no code to deploy.\n */\n error Create2EmptyBytecode();\n\n /**\n * @dev The deployment failed.\n */\n error Create2FailedDeployment();\n\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\n if (address(this).balance < amount) {\n revert Create2InsufficientBalance(address(this).balance, amount);\n }\n if (bytecode.length == 0) {\n revert Create2EmptyBytecode();\n }\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n if (addr == address(0)) {\n revert Create2FailedDeployment();\n }\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" + }, + "@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol": { + "content": "// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "@ultralane/circuits/bin/note/contract/note/plonk_vk.sol": { + "content": "// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol": { + "content": "// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol": { + "content": "// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "contracts/libraries/Field.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\ntype Field is uint256;\n\nlibrary ImplField {\n uint constant PRIME =\n 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001;\n uint constant PRIME_DIV_2 =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n\n function checkField(Field a) internal pure {\n require(Field.unwrap(a) < PRIME, \"Field: input is too large\");\n }\n\n function toFieldUnchecked(uint256 a) internal pure returns (Field b) {\n b = Field.wrap(a);\n }\n function toField(uint256 a) internal pure returns (Field b) {\n b = Field.wrap(a);\n checkField(b);\n }\n\n function toFieldUnchecked(bytes32 a) internal pure returns (Field b) {\n assembly {\n b := a\n }\n }\n function toField(bytes32 a) internal pure returns (Field b) {\n assembly {\n b := a\n }\n checkField(b);\n }\n\n function toBytes32(Field a) internal pure returns (bytes32 b) {\n assembly {\n b := a\n }\n }\n\n function toAddress(Field a) internal pure returns (address b) {\n require(Field.unwrap(a) < (1 << 160), \"Field: input is too large\");\n assembly {\n b := a\n }\n }\n\n function toArr(Field a) internal pure returns (bytes32[] memory b) {\n b = new bytes32[](1);\n b[0] = toBytes32(a);\n }\n\n function toField(address a) internal pure returns (Field b) {\n assembly {\n b := a\n }\n }\n\n function toField(int256 a) internal pure returns (Field) {\n // return Field.wrap(a);\n if (a < 0) {\n require(uint(-a) < PRIME, \"Field: input is too large\");\n return Field.wrap(PRIME - uint256(-a));\n } else {\n require(uint(a) < PRIME, \"Field: input is too large\");\n return Field.wrap(uint256(a));\n }\n }\n\n function into(Field[] memory a) internal pure returns (bytes32[] memory b) {\n assembly {\n b := a\n }\n }\n\n function add(Field a, Field b) internal pure returns (Field c) {\n assembly {\n c := addmod(a, b, PRIME)\n }\n }\n\n function mul(Field a, Field b) internal pure returns (Field c) {\n assembly {\n c := mulmod(a, b, PRIME)\n }\n }\n\n function add(Field a, uint b) internal pure returns (Field c) {\n assembly {\n c := addmod(a, b, PRIME)\n }\n }\n\n function mul(Field a, uint b) internal pure returns (Field c) {\n assembly {\n c := mulmod(a, b, PRIME)\n }\n }\n\n function eq(Field a, Field b) internal pure returns (bool c) {\n assembly {\n c := eq(a, b)\n }\n }\n\n function isZero(Field a) internal pure returns (bool c) {\n assembly {\n c := eq(a, 0)\n }\n }\n\n function signed(\n Field a\n ) internal pure returns (bool positive, uint scalar) {\n uint256 raw = Field.unwrap(a);\n if (raw > PRIME_DIV_2) {\n return (false, PRIME - raw);\n } else {\n return (true, raw);\n }\n }\n}\n" + }, + "contracts/libraries/Poseidon2.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Field, ImplField} from \"./Field.sol\";\n\nlibrary Poseidon2 {\n using ImplField for Field;\n using Poseidon2 for Sponge;\n\n uint constant t = 4;\n uint constant rounds_f = 8;\n uint constant rounds_p = 56;\n uint constant RATE = 3;\n\n struct Constants {\n Field[4] internal_matrix_diagonal;\n Field[4][64] round_constant;\n }\n\n struct Sponge {\n Field iv;\n Field[3] cache;\n Field[4] state;\n uint cache_size;\n bool squeeze_mode; // 0 => absorb, 1 => squeeze\n Constants constants;\n }\n\n /**\n * Public API: best for single time use\n */\n\n function hash_1(Field m) internal pure returns (Field) {\n Field[] memory inputs = new Field[](1);\n inputs[0] = m;\n return hash_internal(load(), inputs, 1, false);\n }\n\n function hash_2(Field m1, Field m2) internal pure returns (Field) {\n Field[] memory inputs = new Field[](2);\n inputs[0] = m1;\n inputs[1] = m2;\n return hash_internal(load(), inputs, 2, false);\n }\n\n function hash_3(\n Field m1,\n Field m2,\n Field m3\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](3);\n inputs[0] = m1;\n inputs[1] = m2;\n inputs[2] = m3;\n return hash_internal(load(), inputs, 3, false);\n }\n\n function hash_var_len(\n Field[] memory inputs,\n uint std_input_length\n ) internal pure returns (Field) {\n return hash_internal(load(), inputs, std_input_length, true);\n }\n\n /**\n * Public API: best for multiple use in same call context\n */\n\n function hash_1(\n Poseidon2.Constants memory constants,\n Field m\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](1);\n inputs[0] = m;\n return hash_internal(constants, inputs, 1, false);\n }\n\n function hash_2(\n Poseidon2.Constants memory constants,\n Field m1,\n Field m2\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](2);\n inputs[0] = m1;\n inputs[1] = m2;\n return hash_internal(constants, inputs, 2, false);\n }\n\n function hash_3(\n Poseidon2.Constants memory constants,\n Field m1,\n Field m2,\n Field m3\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](3);\n inputs[0] = m1;\n inputs[1] = m2;\n inputs[2] = m3;\n return hash_internal(constants, inputs, 3, false);\n }\n\n function hash_var_len(\n Poseidon2.Constants memory constants,\n Field[] memory inputs,\n uint std_input_length\n ) internal pure returns (Field) {\n return hash_internal(constants, inputs, std_input_length, true);\n }\n\n /**\n * Internal methods for hashing\n */\n\n // function hash_internal(\n // Poseidon2.Sponge memory sponge,\n // Field[] memory input,\n // uint std_input_length,\n // bool is_variable_length\n // ) private pure returns (Field) {\n // for (uint i; i < input.length; i++) {\n // if (i < std_input_length) {\n // sponge.absorb(input[i]);\n // }\n // }\n\n // // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // // fixed-length and variable-length hashes do not collide)\n // if (is_variable_length) {\n // sponge.absorb(Field.wrap(1));\n // }\n // return sponge.squeeze();\n // }\n\n function generate_iv(uint input_length) internal pure returns (Field) {\n return Field.wrap(input_length << 64);\n }\n\n function hash_internal(\n Constants memory constants,\n Field[] memory input,\n uint std_input_length,\n bool is_variable_length\n ) private pure returns (Field) {\n Poseidon2.Sponge memory sponge = new_poseidon2(\n generate_iv(input.length),\n constants\n );\n\n for (uint i; i < input.length; i++) {\n if (i < std_input_length) {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if (is_variable_length) {\n sponge.absorb(Field.wrap(1));\n }\n return sponge.squeeze();\n }\n\n function new_poseidon2(\n Field iv,\n Constants memory constants\n ) private pure returns (Poseidon2.Sponge memory) {\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\n iv: iv,\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n cache_size: 0,\n squeeze_mode: false,\n constants: constants\n });\n result.state[RATE] = iv;\n return result;\n }\n\n function new_poseidon2_with_constants(\n Field iv,\n Constants memory constants\n ) private pure returns (Poseidon2.Sponge memory) {\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\n iv: iv,\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n cache_size: 0,\n squeeze_mode: false,\n constants: constants\n });\n result.state[RATE] = iv;\n return result;\n }\n\n function perform_duplex(\n Poseidon2.Sponge memory self\n ) internal pure returns (Field[RATE] memory) {\n // zero-pad the cache\n for (uint i; i < RATE; i++) {\n if (i >= self.cache_size) {\n self.cache[i] = Field.wrap(0);\n }\n }\n\n // add the cache into sponge state\n for (uint i; i < RATE; i++) {\n self.state[i] = self.state[i].add(self.cache[i]);\n }\n self.state = permutation(\n self.state,\n self.constants.internal_matrix_diagonal,\n self.constants.round_constant\n );\n // return `RATE` number of field elements from the sponge state.\n Field[RATE] memory result = [\n Field.wrap(0),\n Field.wrap(0),\n Field.wrap(0)\n ];\n for (uint i; i < RATE; i++) {\n result[i] = self.state[i];\n }\n return result;\n }\n\n function absorb(Poseidon2.Sponge memory self, Field input) internal pure {\n if ((!self.squeeze_mode) && (self.cache_size == RATE)) {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else if ((!self.squeeze_mode) && (self.cache_size != RATE)) {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n } else if (self.squeeze_mode) {\n // If we're in squeeze mode, switch to absorb mode and add the input into the cache.\n // N.B. I don't think this code path can be reached?!\n self.cache[0] = input;\n self.cache_size = 1;\n self.squeeze_mode = false;\n }\n }\n\n function squeeze(\n Poseidon2.Sponge memory self\n ) internal pure returns (Field) {\n if (self.squeeze_mode && (self.cache_size == 0)) {\n // If we're in squeze mode and the cache is empty, there is nothing left to squeeze out of the sponge!\n // Switch to absorb mode.\n self.squeeze_mode = false;\n self.cache_size = 0;\n }\n if (!self.squeeze_mode) {\n // If we're in absorb mode, apply sponge permutation to compress the cache, populate cache with compressed\n // state and switch to squeeze mode. Note: this code block will execute if the previous `if` condition was\n // matched\n Field[RATE] memory new_output_elements = self.perform_duplex();\n self.squeeze_mode = true;\n for (uint i; i < RATE; i++) {\n self.cache[i] = new_output_elements[i];\n }\n self.cache_size = RATE;\n }\n // By this point, we should have a non-empty cache. Pop one item off the top of the cache and return it.\n Field result = self.cache[0];\n for (uint i = 1; i < RATE; i++) {\n if (i < self.cache_size) {\n self.cache[i - 1] = self.cache[i];\n }\n }\n\n self.cache_size -= 1;\n self.cache[self.cache_size] = Field.wrap(0);\n return result;\n }\n\n function permutation(\n Field[4] memory inputs,\n Field[4] memory internal_matrix_diagonal,\n Field[4][64] memory round_constant\n ) private pure returns (Field[4] memory) {\n // Read witness assignments\n Field[4] memory state = [\n Field.wrap(0),\n Field.wrap(0),\n Field.wrap(0),\n Field.wrap(0)\n ];\n for (uint i; i < 4; i++) {\n state[i] = inputs[i];\n }\n\n // Apply 1st linear layer\n matrix_multiplication_4x4(state);\n\n // First set of external rounds\n uint rf_first = rounds_f / 2;\n for (uint r; r < rf_first; r++) {\n add_round_constants(state, round_constant, r);\n s_box(state);\n matrix_multiplication_4x4(state);\n }\n\n // Internal rounds\n uint p_end = rf_first + rounds_p;\n for (uint r = rf_first; r < p_end; r++) {\n state[0] = state[0].add(round_constant[r][0]);\n state[0] = single_box(state[0]);\n internal_m_multiplication(state, internal_matrix_diagonal);\n }\n\n // Remaining external rounds\n uint num_rounds = rounds_f + rounds_p;\n\n for (uint r = p_end; r < num_rounds; r++) {\n add_round_constants(state, round_constant, r);\n s_box(state);\n matrix_multiplication_4x4(state);\n }\n\n return state;\n }\n\n function single_box(Field x) private pure returns (Field) {\n Field s = x.mul(x);\n return s.mul(s).mul(x);\n }\n\n function s_box(Field[4] memory input) private pure {\n for (uint i; i < 4; i++) {\n input[i] = single_box(input[i]);\n }\n }\n\n function add_round_constants(\n Field[4] memory state,\n Field[4][64] memory round_constant,\n uint round\n ) private pure {\n for (uint i; i < 4; i++) {\n state[i] = state[i].add(round_constant[round][i]);\n }\n }\n\n function matrix_multiplication_4x4(Field[4] memory input) private pure {\n Field t0 = input[0].add(input[1]); // A + B\n Field t1 = input[2].add(input[3]); // C + D\n Field t2 = input[1].add(input[1]); // 2B\n t2 = t2.add(t1); // 2B + C + D\n Field t3 = input[3].add(input[3]); // 2D\n t3 = t3.add(t0); // 2D + A + B\n Field t4 = t1.add(t1);\n t4 = t4.add(t4);\n t4 = t4.add(t3); // A + B + 4C + 6D\n Field t5 = t0.add(t0);\n t5 = t5.add(t5);\n t5 = t5.add(t2); // 4A + 6B + C + D\n Field t6 = t3.add(t5); // 5A + 7B + C + 3D\n Field t7 = t2.add(t4); // A + 3B + 5C + 7D\n input[0] = t6;\n input[1] = t5;\n input[2] = t7;\n input[3] = t4;\n }\n\n function internal_m_multiplication(\n Field[4] memory input,\n Field[4] memory internal_matrix_diagonal\n ) private pure {\n Field sum = Field.wrap(0);\n for (uint i; i < 4; i++) {\n sum = sum.add(input[i]);\n }\n for (uint i; i < 4; i++) {\n input[i] = input[i].mul(internal_matrix_diagonal[i]);\n input[i] = input[i].add(sum);\n }\n }\n\n function load() internal pure returns (Constants memory constants) {\n constants = Constants({\n internal_matrix_diagonal: [\n Field.wrap(\n 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7\n ),\n Field.wrap(\n 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b\n ),\n Field.wrap(\n 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15\n ),\n Field.wrap(\n 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b\n )\n ],\n round_constant: [\n [\n Field.wrap(\n 0x19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5\n ),\n Field.wrap(\n 0x265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6\n ),\n Field.wrap(\n 0x199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa\n ),\n Field.wrap(\n 0x157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8\n )\n ],\n [\n Field.wrap(\n 0x2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902\n ),\n Field.wrap(\n 0x0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e\n ),\n Field.wrap(\n 0x251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996\n ),\n Field.wrap(\n 0x13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e\n )\n ],\n [\n Field.wrap(\n 0x0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738\n ),\n Field.wrap(\n 0x011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06\n ),\n Field.wrap(\n 0x0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549\n ),\n Field.wrap(\n 0x04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b\n )\n ],\n [\n Field.wrap(\n 0x0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8\n ),\n Field.wrap(\n 0x259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f\n ),\n Field.wrap(\n 0x28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1\n ),\n Field.wrap(\n 0x0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447\n )\n ],\n [\n Field.wrap(\n 0x0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38\n ),\n Field.wrap(\n 0x0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5\n ),\n Field.wrap(\n 0x1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c\n ),\n Field.wrap(\n 0x25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f\n )\n ],\n [\n Field.wrap(\n 0x0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a\n ),\n Field.wrap(\n 0x13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96\n ),\n Field.wrap(\n 0x2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce\n ),\n Field.wrap(\n 0x21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959\n )\n ],\n [\n Field.wrap(\n 0x05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b\n ),\n Field.wrap(\n 0x0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4\n ),\n Field.wrap(\n 0x0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf\n ),\n Field.wrap(\n 0x09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455\n )\n ],\n [\n Field.wrap(\n 0x0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335\n ),\n Field.wrap(\n 0x2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b\n ),\n Field.wrap(\n 0x1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df\n ),\n Field.wrap(\n 0x176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404\n )\n ]\n ]\n });\n }\n}\n" + }, + "contracts/MerkleTreeWithHistory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Poseidon2} from \"./libraries/Poseidon2.sol\";\nimport {Field, ImplField} from \"./libraries/Field.sol\";\n\ncontract MerkleTreeWithHistory {\n using ImplField for Field;\n\n uint32 public levels;\n\n // the following variables are made public for easier testing and debugging and\n // are not supposed to be accessed in regular code\n\n // filledSubtrees and roots could be bytes32[size], but using mappings makes it cheaper because\n // it removes index range check on every interaction\n mapping(uint256 => Field) public filledSubtrees; // Field[depth]\n mapping(uint256 => Field) public roots; // Field[ROOT_HISTORY_SIZE]\n uint32 public constant ROOT_HISTORY_SIZE = 30;\n uint32 public currentRootIndex = 0;\n uint32 public nextIndex = 0;\n\n constructor(uint32 _levels) {\n require(_levels > 0, \"_levels should be greater than zero\");\n require(_levels <= 32, \"_levels should be less than eq 32\");\n levels = _levels;\n\n for (uint32 i = 0; i < _levels; i++) {\n filledSubtrees[i] = zeros(i);\n }\n\n roots[0] = zeros(_levels - 1);\n }\n\n function _insert(Field leaf) internal returns (uint32 index) {\n uint32 _nextIndex = nextIndex;\n require(\n _nextIndex != uint32(2) ** levels,\n \"Merkle tree is full. No more leaves can be added\"\n );\n uint32 currentIndex = _nextIndex;\n Field currentLevelHash = leaf;\n Field left;\n Field right;\n\n for (uint32 i = 0; i < levels; i++) {\n if (currentIndex % 2 == 0) {\n left = currentLevelHash;\n right = zeros(i);\n filledSubtrees[i] = currentLevelHash;\n } else {\n left = filledSubtrees[i];\n right = currentLevelHash;\n }\n currentLevelHash = Poseidon2.hash_2(left, right);\n currentIndex /= 2;\n }\n\n uint32 newRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE;\n currentRootIndex = newRootIndex;\n roots[newRootIndex] = currentLevelHash;\n nextIndex = _nextIndex + 1;\n return _nextIndex;\n }\n\n /**\n @dev Whether the root is present in the root history\n */\n function isKnownRoot(Field root) public view returns (bool) {\n if (root.isZero()) {\n return false;\n }\n uint32 _currentRootIndex = currentRootIndex;\n uint32 i = _currentRootIndex;\n do {\n if (root.eq(roots[i])) {\n return true;\n }\n if (i == 0) {\n i = ROOT_HISTORY_SIZE;\n }\n i--;\n } while (i != _currentRootIndex);\n return false;\n }\n\n /**\n @dev Returns the last root\n */\n function getLastRoot() public view returns (Field) {\n return roots[currentRootIndex];\n }\n\n /// @dev provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels\n function zeros(uint256 i) public pure returns (Field) {\n if (i == 0) return Field.wrap(0);\n else if (i == 1)\n return\n Field.wrap(\n 0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1\n );\n else if (i == 2)\n return\n Field.wrap(\n 0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290\n );\n else if (i == 3)\n return\n Field.wrap(\n 0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20\n );\n else if (i == 4)\n return\n Field.wrap(\n 0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e\n );\n else if (i == 5)\n return\n Field.wrap(\n 0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf\n );\n else if (i == 6)\n return\n Field.wrap(\n 0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76\n );\n else if (i == 7)\n return\n Field.wrap(\n 0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b\n );\n else if (i == 8)\n return\n Field.wrap(\n 0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1\n );\n else if (i == 9)\n return\n Field.wrap(\n 0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972\n );\n else if (i == 10)\n return\n Field.wrap(\n 0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686\n );\n else if (i == 11)\n return\n Field.wrap(\n 0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7\n );\n else if (i == 12)\n return\n Field.wrap(\n 0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73\n );\n else if (i == 13)\n return\n Field.wrap(\n 0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1\n );\n else if (i == 14)\n return\n Field.wrap(\n 0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a\n );\n else if (i == 15)\n return\n Field.wrap(\n 0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9\n );\n else if (i == 16)\n return\n Field.wrap(\n 0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3\n );\n else if (i == 17)\n return\n Field.wrap(\n 0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3\n );\n else if (i == 18)\n return\n Field.wrap(\n 0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5\n );\n else if (i == 19)\n return\n Field.wrap(\n 0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5\n );\n else if (i == 20)\n return\n Field.wrap(\n 0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755\n );\n else if (i == 21)\n return\n Field.wrap(\n 0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3\n );\n else if (i == 22)\n return\n Field.wrap(\n 0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30\n );\n else if (i == 23)\n return\n Field.wrap(\n 0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4\n );\n else if (i == 24)\n return\n Field.wrap(\n 0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491\n );\n else if (i == 25)\n return\n Field.wrap(\n 0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2\n );\n else if (i == 26)\n return\n Field.wrap(\n 0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9\n );\n else if (i == 27)\n return\n Field.wrap(\n 0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3\n );\n else if (i == 28)\n return\n Field.wrap(\n 0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f\n );\n else if (i == 29)\n return\n Field.wrap(\n 0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c\n );\n else if (i == 30)\n return\n Field.wrap(\n 0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee\n );\n else if (i == 31)\n return\n Field.wrap(\n 0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14\n );\n else if (i == 32)\n return\n Field.wrap(\n 0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d\n );\n else revert(\"Index out of bounds\");\n }\n}\n" + }, + "contracts/Pool.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {Create2} from \"@openzeppelin/contracts/utils/Create2.sol\";\nimport {Field, ImplField} from \"./libraries/Field.sol\";\nimport {SplitJoin16Verifier, Hash2Verifier, NoteVerifier} from \"./Verifier.sol\";\nimport {StealthAddress} from \"./StealthAddress.sol\";\nimport {MerkleTreeWithHistory} from \"./MerkleTreeWithHistory.sol\";\nimport \"hardhat/console.sol\";\n\ncontract Pool is MerkleTreeWithHistory {\n using ImplField for Field;\n using ImplField for uint256;\n using ImplField for int256;\n using ImplField for bytes32;\n using ImplField for address;\n using ImplField for Field[];\n\n Field constant FIELD_ZERO = Field.wrap(0);\n\n Field public constant ZERO_ROOT =\n Field.wrap(\n 0x087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf\n );\n Field public constant ZERO_COMMITMENT =\n Field.wrap(\n 0x0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a\n );\n Field public constant ZERO_NULLIFIER =\n Field.wrap(\n 0x262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb2\n );\n\n bytes32 public constant INIT_CODE_HASH =\n keccak256(type(StealthAddress).creationCode);\n\n IERC20 public usdc;\n SplitJoin16Verifier public splitJoinVerifier;\n Hash2Verifier public hash2Verifier;\n NoteVerifier public noteVerifier;\n\n mapping(Field nullifier => bool isSpent) public isNoteSpent;\n Field[] public noteCommitments;\n\n event NewCommitment(Field commitment);\n event NullifierSpent(Field commitment);\n\n constructor(\n SplitJoin16Verifier _splitJoinVerifier,\n Hash2Verifier _hash2Verifier,\n NoteVerifier _noteVerifier,\n IERC20 _usdc\n ) MerkleTreeWithHistory(16) {\n splitJoinVerifier = _splitJoinVerifier;\n hash2Verifier = _hash2Verifier;\n noteVerifier = _noteVerifier;\n usdc = _usdc;\n _insert(ZERO_COMMITMENT);\n }\n\n function deposit(\n uint amount,\n Field noteCommitment,\n bytes memory proof\n ) external {\n _createDepositUsingHash3(amount, noteCommitment, proof);\n }\n\n // proving split join takes about 5 seconds\n function transact(\n bytes memory proof,\n Field[] memory publicInputs\n ) external {\n // verify that the note has not been spent\n require(isKnownRoot(publicInputs[0]), \"Deposits root unknown\");\n (bool isDeposit, uint amount) = publicInputs[1].signed();\n\n if (!publicInputs[3].eq(ZERO_NULLIFIER)) {\n require(!isNoteSpent[publicInputs[3]], \"Note is spent\");\n isNoteSpent[publicInputs[3]] = true;\n emit NullifierSpent(publicInputs[3]);\n }\n if (!publicInputs[4].eq(ZERO_NULLIFIER)) {\n require(!isNoteSpent[publicInputs[4]], \"Note is spent\");\n isNoteSpent[publicInputs[4]] = true;\n emit NullifierSpent(publicInputs[4]);\n }\n\n require(\n splitJoinVerifier.verify(proof, publicInputs.into()),\n \"split join zk proof failed\"\n );\n\n // insert note in merkle tree and calculate new root\n emit NewCommitment(publicInputs[4]);\n noteCommitments.push(publicInputs[4]);\n _insert(publicInputs[4]);\n\n if (isDeposit) {\n // pull USDC\n usdc.transferFrom(msg.sender, address(this), amount);\n } else {\n // transfer USDC\n usdc.transfer(publicInputs[2].toAddress(), amount);\n }\n }\n\n function collect(\n IERC20 token,\n uint balance,\n Field salt,\n bytes memory stealthAddressOwnershipZkProof,\n Field noteCommitment,\n bytes memory noteCreationZkProof\n ) external {\n require(\n hash2Verifier.verify(stealthAddressOwnershipZkProof, salt.toArr()),\n \"hash2 zk proof failed\"\n );\n StealthAddress wallet = _deployIfNeeded(salt.toBytes32());\n wallet.transferErc20(token, address(this), balance);\n _createDepositUsingHash3(balance, noteCommitment, noteCreationZkProof);\n }\n\n function compute(Field salt) public view returns (address stealthAddress) {\n return Create2.computeAddress(salt.toBytes32(), INIT_CODE_HASH);\n }\n\n function _deployIfNeeded(bytes32 salt) internal returns (StealthAddress) {\n address computed = Create2.computeAddress(salt, INIT_CODE_HASH);\n uint size;\n assembly {\n size := extcodesize(computed)\n }\n if (size == 0) {\n bytes memory bytecode = type(StealthAddress).creationCode;\n address deployed;\n assembly {\n deployed := create2(\n 0,\n add(bytecode, 0x20),\n mload(bytecode),\n salt\n )\n }\n require(\n deployed != address(0),\n \"WalletFactory: failed to deploy wallet\"\n );\n require(deployed == computed, \"WalletFactory: deploy mismatch\");\n }\n return StealthAddress(payable(computed));\n }\n\n // proving note takes about 1 sec\n function _createDepositUsingHash3(\n uint amount,\n Field noteCommitment,\n bytes memory proof\n ) internal {\n // verify that amount is in note commitment preimage using the zk proof\n Field[] memory publicInputs = new Field[](2);\n publicInputs[0] = amount.toField();\n publicInputs[1] = noteCommitment;\n\n require(\n noteVerifier.verify(proof, publicInputs.into()),\n \"note zk proof failed\"\n );\n\n // insert note in merkle tree and calculate new root\n // TODO this requires poseidon2 to be implemented in solidity,\n // temporarily taking this from solidity\n // proving the new deposit root will cause mutex issue hence\n // we have to do poseidon2 in solidity to allow parallel users.\n noteCommitments.push(noteCommitment);\n _insert(noteCommitment);\n }\n\n // proving split join takes about 5 seconds\n function _createDepositUsingSplitJoin(\n uint amount,\n Field noteCommitment,\n bytes memory proof\n ) internal {\n // verify that amount is in note commitment preimage using the zk proof\n Field[] memory publicInputs = new Field[](6);\n publicInputs[0] = ZERO_ROOT;\n publicInputs[1] = amount.toField();\n publicInputs[2] = FIELD_ZERO;\n publicInputs[3] = ZERO_NULLIFIER;\n publicInputs[4] = ZERO_NULLIFIER;\n publicInputs[5] = noteCommitment;\n\n require(\n splitJoinVerifier.verify(proof, publicInputs.into()),\n \"split join zk proof failed\"\n );\n\n // insert note in merkle tree and calculate new root\n // TODO this requires poseidon2 to be implemented in solidity,\n // temporarily taking this from solidity\n // proving the new deposit root will cause mutex issue hence\n // we have to do poseidon2 in solidity to allow parallel users.\n noteCommitments.push(noteCommitment);\n _insert(noteCommitment);\n }\n}\n" + }, + "contracts/StealthAddress.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ncontract StealthAddress {\n address public pool;\n\n constructor() {\n pool = msg.sender;\n }\n\n modifier onlyPool() {\n require(msg.sender == pool, \"only factory\");\n _;\n }\n\n receive() external payable {}\n\n function transferErc20(\n IERC20 token,\n address dest,\n uint amount\n ) external onlyPool returns (bool success) {\n return token.transfer(dest, amount);\n }\n\n function call(\n address dest,\n uint value,\n bytes calldata data\n ) external onlyPool returns (bool success, bytes memory returndata) {\n (success, returndata) = dest.call{value: value}(data);\n }\n}\n" + }, + "contracts/test/FieldTest.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Field, ImplField} from \"../libraries/Field.sol\";\nimport \"hardhat/console.sol\";\n\ncontract FieldTest {\n using ImplField for Field;\n using ImplField for uint256;\n using ImplField for int256;\n using ImplField for bytes32;\n}\n" + }, + "contracts/test/Poseidon2Test.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Field, ImplField} from \"../libraries/Field.sol\";\nimport {Poseidon2} from \"../libraries/Poseidon2.sol\";\n\ncontract Poseidon2Test {\n using ImplField for Field;\n using ImplField for uint256;\n using ImplField for int256;\n using ImplField for bytes32;\n using Poseidon2 for Poseidon2.Constants;\n\n function hash_1(Field m1) public pure returns (Field) {\n return Poseidon2.hash_1(m1);\n }\n\n function hash_1_twice(Field m1) public pure returns (Field) {\n Poseidon2.Constants memory poseidon = Poseidon2.load();\n poseidon.hash_1(m1); // temp\n return poseidon.hash_1(m1);\n }\n\n function hash_2(Field m1, Field m2) public pure returns (Field) {\n return Poseidon2.hash_2(m1, m2);\n }\n\n function hash_3(Field m1, Field m2, Field m3) public pure returns (Field) {\n return Poseidon2.hash_3(m1, m2, m3);\n }\n}\n" + }, + "contracts/USDC.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract USDC is ERC20 {\n constructor() ERC20(\"USDC\", \"USDC\") {\n _mint(msg.sender, 1_000_000_000e6);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return 6;\n }\n}\n" + }, + "contracts/Verifier.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {UltraVerifier as SplitJoin16Verifier_} from \"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\";\nimport {UltraVerifier as SplitJoin32Verifier_} from \"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\";\nimport {UltraVerifier as Hash2Verifier_} from \"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\";\nimport {UltraVerifier as NoteVerifier_} from \"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\";\n\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\n\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\n\ncontract Hash2Verifier is Hash2Verifier_ {}\n\ncontract NoteVerifier is NoteVerifier_ {}\n" + }, + "hardhat/console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS =\n 0x000000000000000000636F6e736F6c652e6c6f67;\n\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\n address consoleAddress = CONSOLE_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n pop(\n staticcall(\n gas(),\n consoleAddress,\n add(payload, 32),\n mload(payload),\n 0,\n 0\n )\n )\n }\n }\n\n function _castToPure(\n function(bytes memory) internal view fnIn\n ) internal pure returns (function(bytes memory) pure fnOut) {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castToPure(_sendLogPayloadImplementation)(payload);\n }\n\n function log() internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n function logInt(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", p0));\n }\n\n function logUint(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function logString(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function log(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256)\", p0, p1));\n }\n\n function log(uint256 p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string)\", p0, p1));\n }\n\n function log(uint256 p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool)\", p0, p1));\n }\n\n function log(uint256 p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address)\", p0, p1));\n }\n\n function log(string memory p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 5000 + }, + "evmVersion": "paris", + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/.chainId b/src/contracts/deployments/sepolia/.chainId new file mode 100644 index 0000000..bd8d1cd --- /dev/null +++ b/src/contracts/deployments/sepolia/.chainId @@ -0,0 +1 @@ +11155111 \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/Hash2Verifier.json b/src/contracts/deployments/sepolia/Hash2Verifier.json new file mode 100644 index 0000000..776f58c --- /dev/null +++ b/src/contracts/deployments/sepolia/Hash2Verifier.json @@ -0,0 +1,148 @@ +{ + "address": "0xB34505B7fcfA024B5ADE57691BCD96F0778df5BA", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x8df1fed47474c7c6ce42a7dbb2d7db8ced6c7cdad65e81438688f2b73d8e5f8a", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0xB34505B7fcfA024B5ADE57691BCD96F0778df5BA", + "transactionIndex": 61, + "gasUsed": "2580890", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xff6128de11c304c7e0403ca4a935d04ab66536594ab048d5fd43e55171382e71", + "transactionHash": "0x8df1fed47474c7c6ce42a7dbb2d7db8ced6c7cdad65e81438688f2b73d8e5f8a", + "logs": [], + "blockNumber": 5498374, + "cumulativeGasUsed": "9570158", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"Hash2Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d81526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212200c21fd4281d309d89bb04fca76b8c8954e9819b6424a3f711852453024ec3e7f64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d81526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212200c21fd4281d309d89bb04fca76b8c8954e9819b6424a3f711852453024ec3e7f64736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/NoteVerifier.json b/src/contracts/deployments/sepolia/NoteVerifier.json new file mode 100644 index 0000000..1803ab5 --- /dev/null +++ b/src/contracts/deployments/sepolia/NoteVerifier.json @@ -0,0 +1,148 @@ +{ + "address": "0x392c24C5E511f1605016989A56f04f009e52D043", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x861096abb7084346a535cad42941510abbc522caffcdd08821d89e231b42fe9c", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0x392c24C5E511f1605016989A56f04f009e52D043", + "transactionIndex": 56, + "gasUsed": "2580938", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa2d2a47ca4f1b3b73457e9d5bdb4c309f6cb21406d195a901a4fa39a2b716354", + "transactionHash": "0x861096abb7084346a535cad42941510abbc522caffcdd08821d89e231b42fe9c", + "logs": [], + "blockNumber": 5498375, + "cumulativeGasUsed": "10222896", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"NoteVerifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517fc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f296259081526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212202c3afaf2ebe595d19832cfb10581f8641bd099139221697c0f8462367c3cc8b264736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517fc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f296259081526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212202c3afaf2ebe595d19832cfb10581f8641bd099139221697c0f8462367c3cc8b264736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/Pool.json b/src/contracts/deployments/sepolia/Pool.json new file mode 100644 index 0000000..fcdaad3 --- /dev/null +++ b/src/contracts/deployments/sepolia/Pool.json @@ -0,0 +1,639 @@ +{ + "address": "0x96afddAe514089F3517703f7262784f5b813F2dA", + "abi": [ + { + "inputs": [ + { + "internalType": "contract SplitJoin16Verifier", + "name": "_splitJoinVerifier", + "type": "address" + }, + { + "internalType": "contract Hash2Verifier", + "name": "_hash2Verifier", + "type": "address" + }, + { + "internalType": "contract NoteVerifier", + "name": "_noteVerifier", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_usdc", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "Field", + "name": "commitment", + "type": "uint256" + } + ], + "name": "NewCommitment", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "Field", + "name": "commitment", + "type": "uint256" + } + ], + "name": "NullifierSpent", + "type": "event" + }, + { + "inputs": [], + "name": "INIT_CODE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ROOT_HISTORY_SIZE", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZERO_COMMITMENT", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZERO_NULLIFIER", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZERO_ROOT", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "Field", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "stealthAddressOwnershipZkProof", + "type": "bytes" + }, + { + "internalType": "Field", + "name": "noteCommitment", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "noteCreationZkProof", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "Field", + "name": "salt", + "type": "uint256" + } + ], + "name": "compute", + "outputs": [ + { + "internalType": "address", + "name": "stealthAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentRootIndex", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "Field", + "name": "noteCommitment", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "filledSubtrees", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastRoot", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "hash2Verifier", + "outputs": [ + { + "internalType": "contract Hash2Verifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "Field", + "name": "root", + "type": "uint256" + } + ], + "name": "isKnownRoot", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "Field", + "name": "nullifier", + "type": "uint256" + } + ], + "name": "isNoteSpent", + "outputs": [ + { + "internalType": "bool", + "name": "isSpent", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "levels", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextIndex", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "noteCommitments", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "noteVerifier", + "outputs": [ + { + "internalType": "contract NoteVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "roots", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "splitJoinVerifier", + "outputs": [ + { + "internalType": "contract SplitJoin16Verifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + }, + { + "internalType": "Field[]", + "name": "publicInputs", + "type": "uint256[]" + } + ], + "name": "transact", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "usdc", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + } + ], + "name": "zeros", + "outputs": [ + { + "internalType": "Field", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0xa2be9f938482e7be3a70a064ee2fbc6aac6d8463d96c21d46706f7ce4d4b022f", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0x96afddAe514089F3517703f7262784f5b813F2dA", + "transactionIndex": 83, + "gasUsed": "8624034", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x59081691a1e1c5e61f69f570ef6830b4e326eeaa78945f192b28ff8cb5a20c25", + "transactionHash": "0xa2be9f938482e7be3a70a064ee2fbc6aac6d8463d96c21d46706f7ce4d4b022f", + "logs": [], + "blockNumber": 5498376, + "cumulativeGasUsed": "19759419", + "status": 1, + "byzantium": true + }, + "args": [ + "0x4298B6a7E18A55996697DDD009BbD5BeEADF199F", + "0xB34505B7fcfA024B5ADE57691BCD96F0778df5BA", + "0x392c24C5E511f1605016989A56f04f009e52D043", + "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8" + ], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract SplitJoin16Verifier\",\"name\":\"_splitJoinVerifier\",\"type\":\"address\"},{\"internalType\":\"contract Hash2Verifier\",\"name\":\"_hash2Verifier\",\"type\":\"address\"},{\"internalType\":\"contract NoteVerifier\",\"name\":\"_noteVerifier\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_usdc\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"Field\",\"name\":\"commitment\",\"type\":\"uint256\"}],\"name\":\"NewCommitment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"Field\",\"name\":\"commitment\",\"type\":\"uint256\"}],\"name\":\"NullifierSpent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"INIT_CODE_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROOT_HISTORY_SIZE\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ZERO_COMMITMENT\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ZERO_NULLIFIER\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ZERO_ROOT\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"Field\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"stealthAddressOwnershipZkProof\",\"type\":\"bytes\"},{\"internalType\":\"Field\",\"name\":\"noteCommitment\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"noteCreationZkProof\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Field\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"compute\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"stealthAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRootIndex\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"Field\",\"name\":\"noteCommitment\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"filledSubtrees\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRoot\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hash2Verifier\",\"outputs\":[{\"internalType\":\"contract Hash2Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Field\",\"name\":\"root\",\"type\":\"uint256\"}],\"name\":\"isKnownRoot\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Field\",\"name\":\"nullifier\",\"type\":\"uint256\"}],\"name\":\"isNoteSpent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isSpent\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"levels\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextIndex\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"noteCommitments\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"noteVerifier\",\"outputs\":[{\"internalType\":\"contract NoteVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"roots\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"splitJoinVerifier\",\"outputs\":[{\"internalType\":\"contract SplitJoin16Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"internalType\":\"Field[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\"}],\"name\":\"transact\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdc\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"zeros\",\"outputs\":[{\"internalType\":\"Field\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getLastRoot()\":{\"details\":\"Returns the last root\"},\"isKnownRoot(uint256)\":{\"details\":\"Whether the root is present in the root history\"},\"zeros(uint256)\":{\"details\":\"provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Pool.sol\":\"Pool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Not enough balance for performing a CREATE2 deploy.\\n */\\n error Create2InsufficientBalance(uint256 balance, uint256 needed);\\n\\n /**\\n * @dev There's no code to deploy.\\n */\\n error Create2EmptyBytecode();\\n\\n /**\\n * @dev The deployment failed.\\n */\\n error Create2FailedDeployment();\\n\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\\n if (address(this).balance < amount) {\\n revert Create2InsufficientBalance(address(this).balance, amount);\\n }\\n if (bytecode.length == 0) {\\n revert Create2EmptyBytecode();\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n if (addr == address(0)) {\\n revert Create2FailedDeployment();\\n }\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2b9807d194b92f1068d868e9587d27037264a9a067c778486f86ae21c61cbd5e\",\"license\":\"MIT\"},\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/MerkleTreeWithHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport {Poseidon2} from \\\"./libraries/Poseidon2.sol\\\";\\nimport {Field, ImplField} from \\\"./libraries/Field.sol\\\";\\n\\ncontract MerkleTreeWithHistory {\\n using ImplField for Field;\\n\\n uint32 public levels;\\n\\n // the following variables are made public for easier testing and debugging and\\n // are not supposed to be accessed in regular code\\n\\n // filledSubtrees and roots could be bytes32[size], but using mappings makes it cheaper because\\n // it removes index range check on every interaction\\n mapping(uint256 => Field) public filledSubtrees; // Field[depth]\\n mapping(uint256 => Field) public roots; // Field[ROOT_HISTORY_SIZE]\\n uint32 public constant ROOT_HISTORY_SIZE = 30;\\n uint32 public currentRootIndex = 0;\\n uint32 public nextIndex = 0;\\n\\n constructor(uint32 _levels) {\\n require(_levels > 0, \\\"_levels should be greater than zero\\\");\\n require(_levels <= 32, \\\"_levels should be less than eq 32\\\");\\n levels = _levels;\\n\\n for (uint32 i = 0; i < _levels; i++) {\\n filledSubtrees[i] = zeros(i);\\n }\\n\\n roots[0] = zeros(_levels - 1);\\n }\\n\\n function _insert(Field leaf) internal returns (uint32 index) {\\n uint32 _nextIndex = nextIndex;\\n require(\\n _nextIndex != uint32(2) ** levels,\\n \\\"Merkle tree is full. No more leaves can be added\\\"\\n );\\n uint32 currentIndex = _nextIndex;\\n Field currentLevelHash = leaf;\\n Field left;\\n Field right;\\n\\n for (uint32 i = 0; i < levels; i++) {\\n if (currentIndex % 2 == 0) {\\n left = currentLevelHash;\\n right = zeros(i);\\n filledSubtrees[i] = currentLevelHash;\\n } else {\\n left = filledSubtrees[i];\\n right = currentLevelHash;\\n }\\n currentLevelHash = Poseidon2.hash_2(left, right);\\n currentIndex /= 2;\\n }\\n\\n uint32 newRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE;\\n currentRootIndex = newRootIndex;\\n roots[newRootIndex] = currentLevelHash;\\n nextIndex = _nextIndex + 1;\\n return _nextIndex;\\n }\\n\\n /**\\n @dev Whether the root is present in the root history\\n */\\n function isKnownRoot(Field root) public view returns (bool) {\\n if (root.isZero()) {\\n return false;\\n }\\n uint32 _currentRootIndex = currentRootIndex;\\n uint32 i = _currentRootIndex;\\n do {\\n if (root.eq(roots[i])) {\\n return true;\\n }\\n if (i == 0) {\\n i = ROOT_HISTORY_SIZE;\\n }\\n i--;\\n } while (i != _currentRootIndex);\\n return false;\\n }\\n\\n /**\\n @dev Returns the last root\\n */\\n function getLastRoot() public view returns (Field) {\\n return roots[currentRootIndex];\\n }\\n\\n /// @dev provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels\\n function zeros(uint256 i) public pure returns (Field) {\\n if (i == 0) return Field.wrap(0);\\n else if (i == 1)\\n return\\n Field.wrap(\\n 0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1\\n );\\n else if (i == 2)\\n return\\n Field.wrap(\\n 0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290\\n );\\n else if (i == 3)\\n return\\n Field.wrap(\\n 0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20\\n );\\n else if (i == 4)\\n return\\n Field.wrap(\\n 0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e\\n );\\n else if (i == 5)\\n return\\n Field.wrap(\\n 0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf\\n );\\n else if (i == 6)\\n return\\n Field.wrap(\\n 0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76\\n );\\n else if (i == 7)\\n return\\n Field.wrap(\\n 0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b\\n );\\n else if (i == 8)\\n return\\n Field.wrap(\\n 0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1\\n );\\n else if (i == 9)\\n return\\n Field.wrap(\\n 0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972\\n );\\n else if (i == 10)\\n return\\n Field.wrap(\\n 0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686\\n );\\n else if (i == 11)\\n return\\n Field.wrap(\\n 0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7\\n );\\n else if (i == 12)\\n return\\n Field.wrap(\\n 0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73\\n );\\n else if (i == 13)\\n return\\n Field.wrap(\\n 0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1\\n );\\n else if (i == 14)\\n return\\n Field.wrap(\\n 0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a\\n );\\n else if (i == 15)\\n return\\n Field.wrap(\\n 0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9\\n );\\n else if (i == 16)\\n return\\n Field.wrap(\\n 0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3\\n );\\n else if (i == 17)\\n return\\n Field.wrap(\\n 0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3\\n );\\n else if (i == 18)\\n return\\n Field.wrap(\\n 0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5\\n );\\n else if (i == 19)\\n return\\n Field.wrap(\\n 0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5\\n );\\n else if (i == 20)\\n return\\n Field.wrap(\\n 0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755\\n );\\n else if (i == 21)\\n return\\n Field.wrap(\\n 0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3\\n );\\n else if (i == 22)\\n return\\n Field.wrap(\\n 0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30\\n );\\n else if (i == 23)\\n return\\n Field.wrap(\\n 0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4\\n );\\n else if (i == 24)\\n return\\n Field.wrap(\\n 0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491\\n );\\n else if (i == 25)\\n return\\n Field.wrap(\\n 0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2\\n );\\n else if (i == 26)\\n return\\n Field.wrap(\\n 0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9\\n );\\n else if (i == 27)\\n return\\n Field.wrap(\\n 0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3\\n );\\n else if (i == 28)\\n return\\n Field.wrap(\\n 0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f\\n );\\n else if (i == 29)\\n return\\n Field.wrap(\\n 0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c\\n );\\n else if (i == 30)\\n return\\n Field.wrap(\\n 0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee\\n );\\n else if (i == 31)\\n return\\n Field.wrap(\\n 0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14\\n );\\n else if (i == 32)\\n return\\n Field.wrap(\\n 0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d\\n );\\n else revert(\\\"Index out of bounds\\\");\\n }\\n}\\n\",\"keccak256\":\"0x4a78cc71a6aac6f7174a9da2b3f481f42ee83ade33e40240573081e8b0f3c628\",\"license\":\"MIT\"},\"contracts/Pool.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {Create2} from \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport {Field, ImplField} from \\\"./libraries/Field.sol\\\";\\nimport {SplitJoin16Verifier, Hash2Verifier, NoteVerifier} from \\\"./Verifier.sol\\\";\\nimport {StealthAddress} from \\\"./StealthAddress.sol\\\";\\nimport {MerkleTreeWithHistory} from \\\"./MerkleTreeWithHistory.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\ncontract Pool is MerkleTreeWithHistory {\\n using ImplField for Field;\\n using ImplField for uint256;\\n using ImplField for int256;\\n using ImplField for bytes32;\\n using ImplField for address;\\n using ImplField for Field[];\\n\\n Field constant FIELD_ZERO = Field.wrap(0);\\n\\n Field public constant ZERO_ROOT =\\n Field.wrap(\\n 0x087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf\\n );\\n Field public constant ZERO_COMMITMENT =\\n Field.wrap(\\n 0x0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a\\n );\\n Field public constant ZERO_NULLIFIER =\\n Field.wrap(\\n 0x262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb2\\n );\\n\\n bytes32 public constant INIT_CODE_HASH =\\n keccak256(type(StealthAddress).creationCode);\\n\\n IERC20 public usdc;\\n SplitJoin16Verifier public splitJoinVerifier;\\n Hash2Verifier public hash2Verifier;\\n NoteVerifier public noteVerifier;\\n\\n mapping(Field nullifier => bool isSpent) public isNoteSpent;\\n Field[] public noteCommitments;\\n\\n event NewCommitment(Field commitment);\\n event NullifierSpent(Field commitment);\\n\\n constructor(\\n SplitJoin16Verifier _splitJoinVerifier,\\n Hash2Verifier _hash2Verifier,\\n NoteVerifier _noteVerifier,\\n IERC20 _usdc\\n ) MerkleTreeWithHistory(16) {\\n splitJoinVerifier = _splitJoinVerifier;\\n hash2Verifier = _hash2Verifier;\\n noteVerifier = _noteVerifier;\\n usdc = _usdc;\\n _insert(ZERO_COMMITMENT);\\n }\\n\\n function deposit(\\n uint amount,\\n Field noteCommitment,\\n bytes memory proof\\n ) external {\\n _createDepositUsingHash3(amount, noteCommitment, proof);\\n }\\n\\n // proving split join takes about 5 seconds\\n function transact(\\n bytes memory proof,\\n Field[] memory publicInputs\\n ) external {\\n // verify that the note has not been spent\\n require(isKnownRoot(publicInputs[0]), \\\"Deposits root unknown\\\");\\n (bool isDeposit, uint amount) = publicInputs[1].signed();\\n\\n if (!publicInputs[3].eq(ZERO_NULLIFIER)) {\\n require(!isNoteSpent[publicInputs[3]], \\\"Note is spent\\\");\\n isNoteSpent[publicInputs[3]] = true;\\n emit NullifierSpent(publicInputs[3]);\\n }\\n if (!publicInputs[4].eq(ZERO_NULLIFIER)) {\\n require(!isNoteSpent[publicInputs[4]], \\\"Note is spent\\\");\\n isNoteSpent[publicInputs[4]] = true;\\n emit NullifierSpent(publicInputs[4]);\\n }\\n\\n require(\\n splitJoinVerifier.verify(proof, publicInputs.into()),\\n \\\"split join zk proof failed\\\"\\n );\\n\\n // insert note in merkle tree and calculate new root\\n emit NewCommitment(publicInputs[4]);\\n noteCommitments.push(publicInputs[4]);\\n _insert(publicInputs[4]);\\n\\n if (isDeposit) {\\n // pull USDC\\n usdc.transferFrom(msg.sender, address(this), amount);\\n } else {\\n // transfer USDC\\n usdc.transfer(publicInputs[2].toAddress(), amount);\\n }\\n }\\n\\n function collect(\\n IERC20 token,\\n uint balance,\\n Field salt,\\n bytes memory stealthAddressOwnershipZkProof,\\n Field noteCommitment,\\n bytes memory noteCreationZkProof\\n ) external {\\n require(\\n hash2Verifier.verify(stealthAddressOwnershipZkProof, salt.toArr()),\\n \\\"hash2 zk proof failed\\\"\\n );\\n StealthAddress wallet = _deployIfNeeded(salt.toBytes32());\\n wallet.transferErc20(token, address(this), balance);\\n _createDepositUsingHash3(balance, noteCommitment, noteCreationZkProof);\\n }\\n\\n function compute(Field salt) public view returns (address stealthAddress) {\\n return Create2.computeAddress(salt.toBytes32(), INIT_CODE_HASH);\\n }\\n\\n function _deployIfNeeded(bytes32 salt) internal returns (StealthAddress) {\\n address computed = Create2.computeAddress(salt, INIT_CODE_HASH);\\n uint size;\\n assembly {\\n size := extcodesize(computed)\\n }\\n if (size == 0) {\\n bytes memory bytecode = type(StealthAddress).creationCode;\\n address deployed;\\n assembly {\\n deployed := create2(\\n 0,\\n add(bytecode, 0x20),\\n mload(bytecode),\\n salt\\n )\\n }\\n require(\\n deployed != address(0),\\n \\\"WalletFactory: failed to deploy wallet\\\"\\n );\\n require(deployed == computed, \\\"WalletFactory: deploy mismatch\\\");\\n }\\n return StealthAddress(payable(computed));\\n }\\n\\n // proving note takes about 1 sec\\n function _createDepositUsingHash3(\\n uint amount,\\n Field noteCommitment,\\n bytes memory proof\\n ) internal {\\n // verify that amount is in note commitment preimage using the zk proof\\n Field[] memory publicInputs = new Field[](2);\\n publicInputs[0] = amount.toField();\\n publicInputs[1] = noteCommitment;\\n\\n require(\\n noteVerifier.verify(proof, publicInputs.into()),\\n \\\"note zk proof failed\\\"\\n );\\n\\n // insert note in merkle tree and calculate new root\\n // TODO this requires poseidon2 to be implemented in solidity,\\n // temporarily taking this from solidity\\n // proving the new deposit root will cause mutex issue hence\\n // we have to do poseidon2 in solidity to allow parallel users.\\n noteCommitments.push(noteCommitment);\\n _insert(noteCommitment);\\n }\\n\\n // proving split join takes about 5 seconds\\n function _createDepositUsingSplitJoin(\\n uint amount,\\n Field noteCommitment,\\n bytes memory proof\\n ) internal {\\n // verify that amount is in note commitment preimage using the zk proof\\n Field[] memory publicInputs = new Field[](6);\\n publicInputs[0] = ZERO_ROOT;\\n publicInputs[1] = amount.toField();\\n publicInputs[2] = FIELD_ZERO;\\n publicInputs[3] = ZERO_NULLIFIER;\\n publicInputs[4] = ZERO_NULLIFIER;\\n publicInputs[5] = noteCommitment;\\n\\n require(\\n splitJoinVerifier.verify(proof, publicInputs.into()),\\n \\\"split join zk proof failed\\\"\\n );\\n\\n // insert note in merkle tree and calculate new root\\n // TODO this requires poseidon2 to be implemented in solidity,\\n // temporarily taking this from solidity\\n // proving the new deposit root will cause mutex issue hence\\n // we have to do poseidon2 in solidity to allow parallel users.\\n noteCommitments.push(noteCommitment);\\n _insert(noteCommitment);\\n }\\n}\\n\",\"keccak256\":\"0x207cdf65853db9e7b762e16a59c9b68eed342b7408dc6fd499ce70b4dc46ddd3\",\"license\":\"UNLICENSED\"},\"contracts/StealthAddress.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ncontract StealthAddress {\\n address public pool;\\n\\n constructor() {\\n pool = msg.sender;\\n }\\n\\n modifier onlyPool() {\\n require(msg.sender == pool, \\\"only factory\\\");\\n _;\\n }\\n\\n receive() external payable {}\\n\\n function transferErc20(\\n IERC20 token,\\n address dest,\\n uint amount\\n ) external onlyPool returns (bool success) {\\n return token.transfer(dest, amount);\\n }\\n\\n function call(\\n address dest,\\n uint value,\\n bytes calldata data\\n ) external onlyPool returns (bool success, bytes memory returndata) {\\n (success, returndata) = dest.call{value: value}(data);\\n }\\n}\\n\",\"keccak256\":\"0x89b5680e201e061ad7102ef74bd6385b2a672b91330be9e501fc3e7c2af59853\",\"license\":\"UNLICENSED\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"},\"contracts/libraries/Field.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\ntype Field is uint256;\\n\\nlibrary ImplField {\\n uint constant PRIME =\\n 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001;\\n uint constant PRIME_DIV_2 =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n\\n function checkField(Field a) internal pure {\\n require(Field.unwrap(a) < PRIME, \\\"Field: input is too large\\\");\\n }\\n\\n function toFieldUnchecked(uint256 a) internal pure returns (Field b) {\\n b = Field.wrap(a);\\n }\\n function toField(uint256 a) internal pure returns (Field b) {\\n b = Field.wrap(a);\\n checkField(b);\\n }\\n\\n function toFieldUnchecked(bytes32 a) internal pure returns (Field b) {\\n assembly {\\n b := a\\n }\\n }\\n function toField(bytes32 a) internal pure returns (Field b) {\\n assembly {\\n b := a\\n }\\n checkField(b);\\n }\\n\\n function toBytes32(Field a) internal pure returns (bytes32 b) {\\n assembly {\\n b := a\\n }\\n }\\n\\n function toAddress(Field a) internal pure returns (address b) {\\n require(Field.unwrap(a) < (1 << 160), \\\"Field: input is too large\\\");\\n assembly {\\n b := a\\n }\\n }\\n\\n function toArr(Field a) internal pure returns (bytes32[] memory b) {\\n b = new bytes32[](1);\\n b[0] = toBytes32(a);\\n }\\n\\n function toField(address a) internal pure returns (Field b) {\\n assembly {\\n b := a\\n }\\n }\\n\\n function toField(int256 a) internal pure returns (Field) {\\n // return Field.wrap(a);\\n if (a < 0) {\\n require(uint(-a) < PRIME, \\\"Field: input is too large\\\");\\n return Field.wrap(PRIME - uint256(-a));\\n } else {\\n require(uint(a) < PRIME, \\\"Field: input is too large\\\");\\n return Field.wrap(uint256(a));\\n }\\n }\\n\\n function into(Field[] memory a) internal pure returns (bytes32[] memory b) {\\n assembly {\\n b := a\\n }\\n }\\n\\n function add(Field a, Field b) internal pure returns (Field c) {\\n assembly {\\n c := addmod(a, b, PRIME)\\n }\\n }\\n\\n function mul(Field a, Field b) internal pure returns (Field c) {\\n assembly {\\n c := mulmod(a, b, PRIME)\\n }\\n }\\n\\n function add(Field a, uint b) internal pure returns (Field c) {\\n assembly {\\n c := addmod(a, b, PRIME)\\n }\\n }\\n\\n function mul(Field a, uint b) internal pure returns (Field c) {\\n assembly {\\n c := mulmod(a, b, PRIME)\\n }\\n }\\n\\n function eq(Field a, Field b) internal pure returns (bool c) {\\n assembly {\\n c := eq(a, b)\\n }\\n }\\n\\n function isZero(Field a) internal pure returns (bool c) {\\n assembly {\\n c := eq(a, 0)\\n }\\n }\\n\\n function signed(\\n Field a\\n ) internal pure returns (bool positive, uint scalar) {\\n uint256 raw = Field.unwrap(a);\\n if (raw > PRIME_DIV_2) {\\n return (false, PRIME - raw);\\n } else {\\n return (true, raw);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd502d38a494a495f33e3dd385774ed6dc69d56d5c10bddad60c41b08a1dc2fd9\",\"license\":\"UNLICENSED\"},\"contracts/libraries/Poseidon2.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {Field, ImplField} from \\\"./Field.sol\\\";\\n\\nlibrary Poseidon2 {\\n using ImplField for Field;\\n using Poseidon2 for Sponge;\\n\\n uint constant t = 4;\\n uint constant rounds_f = 8;\\n uint constant rounds_p = 56;\\n uint constant RATE = 3;\\n\\n struct Constants {\\n Field[4] internal_matrix_diagonal;\\n Field[4][64] round_constant;\\n }\\n\\n struct Sponge {\\n Field iv;\\n Field[3] cache;\\n Field[4] state;\\n uint cache_size;\\n bool squeeze_mode; // 0 => absorb, 1 => squeeze\\n Constants constants;\\n }\\n\\n /**\\n * Public API: best for single time use\\n */\\n\\n function hash_1(Field m) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](1);\\n inputs[0] = m;\\n return hash_internal(load(), inputs, 1, false);\\n }\\n\\n function hash_2(Field m1, Field m2) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](2);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n return hash_internal(load(), inputs, 2, false);\\n }\\n\\n function hash_3(\\n Field m1,\\n Field m2,\\n Field m3\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](3);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n inputs[2] = m3;\\n return hash_internal(load(), inputs, 3, false);\\n }\\n\\n function hash_var_len(\\n Field[] memory inputs,\\n uint std_input_length\\n ) internal pure returns (Field) {\\n return hash_internal(load(), inputs, std_input_length, true);\\n }\\n\\n /**\\n * Public API: best for multiple use in same call context\\n */\\n\\n function hash_1(\\n Poseidon2.Constants memory constants,\\n Field m\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](1);\\n inputs[0] = m;\\n return hash_internal(constants, inputs, 1, false);\\n }\\n\\n function hash_2(\\n Poseidon2.Constants memory constants,\\n Field m1,\\n Field m2\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](2);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n return hash_internal(constants, inputs, 2, false);\\n }\\n\\n function hash_3(\\n Poseidon2.Constants memory constants,\\n Field m1,\\n Field m2,\\n Field m3\\n ) internal pure returns (Field) {\\n Field[] memory inputs = new Field[](3);\\n inputs[0] = m1;\\n inputs[1] = m2;\\n inputs[2] = m3;\\n return hash_internal(constants, inputs, 3, false);\\n }\\n\\n function hash_var_len(\\n Poseidon2.Constants memory constants,\\n Field[] memory inputs,\\n uint std_input_length\\n ) internal pure returns (Field) {\\n return hash_internal(constants, inputs, std_input_length, true);\\n }\\n\\n /**\\n * Internal methods for hashing\\n */\\n\\n // function hash_internal(\\n // Poseidon2.Sponge memory sponge,\\n // Field[] memory input,\\n // uint std_input_length,\\n // bool is_variable_length\\n // ) private pure returns (Field) {\\n // for (uint i; i < input.length; i++) {\\n // if (i < std_input_length) {\\n // sponge.absorb(input[i]);\\n // }\\n // }\\n\\n // // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\\n // // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\\n // // fixed-length and variable-length hashes do not collide)\\n // if (is_variable_length) {\\n // sponge.absorb(Field.wrap(1));\\n // }\\n // return sponge.squeeze();\\n // }\\n\\n function generate_iv(uint input_length) internal pure returns (Field) {\\n return Field.wrap(input_length << 64);\\n }\\n\\n function hash_internal(\\n Constants memory constants,\\n Field[] memory input,\\n uint std_input_length,\\n bool is_variable_length\\n ) private pure returns (Field) {\\n Poseidon2.Sponge memory sponge = new_poseidon2(\\n generate_iv(input.length),\\n constants\\n );\\n\\n for (uint i; i < input.length; i++) {\\n if (i < std_input_length) {\\n sponge.absorb(input[i]);\\n }\\n }\\n\\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\\n // fixed-length and variable-length hashes do not collide)\\n if (is_variable_length) {\\n sponge.absorb(Field.wrap(1));\\n }\\n return sponge.squeeze();\\n }\\n\\n function new_poseidon2(\\n Field iv,\\n Constants memory constants\\n ) private pure returns (Poseidon2.Sponge memory) {\\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\\n iv: iv,\\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n cache_size: 0,\\n squeeze_mode: false,\\n constants: constants\\n });\\n result.state[RATE] = iv;\\n return result;\\n }\\n\\n function new_poseidon2_with_constants(\\n Field iv,\\n Constants memory constants\\n ) private pure returns (Poseidon2.Sponge memory) {\\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\\n iv: iv,\\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\\n cache_size: 0,\\n squeeze_mode: false,\\n constants: constants\\n });\\n result.state[RATE] = iv;\\n return result;\\n }\\n\\n function perform_duplex(\\n Poseidon2.Sponge memory self\\n ) internal pure returns (Field[RATE] memory) {\\n // zero-pad the cache\\n for (uint i; i < RATE; i++) {\\n if (i >= self.cache_size) {\\n self.cache[i] = Field.wrap(0);\\n }\\n }\\n\\n // add the cache into sponge state\\n for (uint i; i < RATE; i++) {\\n self.state[i] = self.state[i].add(self.cache[i]);\\n }\\n self.state = permutation(\\n self.state,\\n self.constants.internal_matrix_diagonal,\\n self.constants.round_constant\\n );\\n // return `RATE` number of field elements from the sponge state.\\n Field[RATE] memory result = [\\n Field.wrap(0),\\n Field.wrap(0),\\n Field.wrap(0)\\n ];\\n for (uint i; i < RATE; i++) {\\n result[i] = self.state[i];\\n }\\n return result;\\n }\\n\\n function absorb(Poseidon2.Sponge memory self, Field input) internal pure {\\n if ((!self.squeeze_mode) && (self.cache_size == RATE)) {\\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\\n self.perform_duplex();\\n self.cache[0] = input;\\n self.cache_size = 1;\\n } else if ((!self.squeeze_mode) && (self.cache_size != RATE)) {\\n // If we're absorbing, and the cache is not full, add the input into the cache\\n self.cache[self.cache_size] = input;\\n self.cache_size += 1;\\n } else if (self.squeeze_mode) {\\n // If we're in squeeze mode, switch to absorb mode and add the input into the cache.\\n // N.B. I don't think this code path can be reached?!\\n self.cache[0] = input;\\n self.cache_size = 1;\\n self.squeeze_mode = false;\\n }\\n }\\n\\n function squeeze(\\n Poseidon2.Sponge memory self\\n ) internal pure returns (Field) {\\n if (self.squeeze_mode && (self.cache_size == 0)) {\\n // If we're in squeze mode and the cache is empty, there is nothing left to squeeze out of the sponge!\\n // Switch to absorb mode.\\n self.squeeze_mode = false;\\n self.cache_size = 0;\\n }\\n if (!self.squeeze_mode) {\\n // If we're in absorb mode, apply sponge permutation to compress the cache, populate cache with compressed\\n // state and switch to squeeze mode. Note: this code block will execute if the previous `if` condition was\\n // matched\\n Field[RATE] memory new_output_elements = self.perform_duplex();\\n self.squeeze_mode = true;\\n for (uint i; i < RATE; i++) {\\n self.cache[i] = new_output_elements[i];\\n }\\n self.cache_size = RATE;\\n }\\n // By this point, we should have a non-empty cache. Pop one item off the top of the cache and return it.\\n Field result = self.cache[0];\\n for (uint i = 1; i < RATE; i++) {\\n if (i < self.cache_size) {\\n self.cache[i - 1] = self.cache[i];\\n }\\n }\\n\\n self.cache_size -= 1;\\n self.cache[self.cache_size] = Field.wrap(0);\\n return result;\\n }\\n\\n function permutation(\\n Field[4] memory inputs,\\n Field[4] memory internal_matrix_diagonal,\\n Field[4][64] memory round_constant\\n ) private pure returns (Field[4] memory) {\\n // Read witness assignments\\n Field[4] memory state = [\\n Field.wrap(0),\\n Field.wrap(0),\\n Field.wrap(0),\\n Field.wrap(0)\\n ];\\n for (uint i; i < 4; i++) {\\n state[i] = inputs[i];\\n }\\n\\n // Apply 1st linear layer\\n matrix_multiplication_4x4(state);\\n\\n // First set of external rounds\\n uint rf_first = rounds_f / 2;\\n for (uint r; r < rf_first; r++) {\\n add_round_constants(state, round_constant, r);\\n s_box(state);\\n matrix_multiplication_4x4(state);\\n }\\n\\n // Internal rounds\\n uint p_end = rf_first + rounds_p;\\n for (uint r = rf_first; r < p_end; r++) {\\n state[0] = state[0].add(round_constant[r][0]);\\n state[0] = single_box(state[0]);\\n internal_m_multiplication(state, internal_matrix_diagonal);\\n }\\n\\n // Remaining external rounds\\n uint num_rounds = rounds_f + rounds_p;\\n\\n for (uint r = p_end; r < num_rounds; r++) {\\n add_round_constants(state, round_constant, r);\\n s_box(state);\\n matrix_multiplication_4x4(state);\\n }\\n\\n return state;\\n }\\n\\n function single_box(Field x) private pure returns (Field) {\\n Field s = x.mul(x);\\n return s.mul(s).mul(x);\\n }\\n\\n function s_box(Field[4] memory input) private pure {\\n for (uint i; i < 4; i++) {\\n input[i] = single_box(input[i]);\\n }\\n }\\n\\n function add_round_constants(\\n Field[4] memory state,\\n Field[4][64] memory round_constant,\\n uint round\\n ) private pure {\\n for (uint i; i < 4; i++) {\\n state[i] = state[i].add(round_constant[round][i]);\\n }\\n }\\n\\n function matrix_multiplication_4x4(Field[4] memory input) private pure {\\n Field t0 = input[0].add(input[1]); // A + B\\n Field t1 = input[2].add(input[3]); // C + D\\n Field t2 = input[1].add(input[1]); // 2B\\n t2 = t2.add(t1); // 2B + C + D\\n Field t3 = input[3].add(input[3]); // 2D\\n t3 = t3.add(t0); // 2D + A + B\\n Field t4 = t1.add(t1);\\n t4 = t4.add(t4);\\n t4 = t4.add(t3); // A + B + 4C + 6D\\n Field t5 = t0.add(t0);\\n t5 = t5.add(t5);\\n t5 = t5.add(t2); // 4A + 6B + C + D\\n Field t6 = t3.add(t5); // 5A + 7B + C + 3D\\n Field t7 = t2.add(t4); // A + 3B + 5C + 7D\\n input[0] = t6;\\n input[1] = t5;\\n input[2] = t7;\\n input[3] = t4;\\n }\\n\\n function internal_m_multiplication(\\n Field[4] memory input,\\n Field[4] memory internal_matrix_diagonal\\n ) private pure {\\n Field sum = Field.wrap(0);\\n for (uint i; i < 4; i++) {\\n sum = sum.add(input[i]);\\n }\\n for (uint i; i < 4; i++) {\\n input[i] = input[i].mul(internal_matrix_diagonal[i]);\\n input[i] = input[i].add(sum);\\n }\\n }\\n\\n function load() internal pure returns (Constants memory constants) {\\n constants = Constants({\\n internal_matrix_diagonal: [\\n Field.wrap(\\n 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7\\n ),\\n Field.wrap(\\n 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b\\n ),\\n Field.wrap(\\n 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15\\n ),\\n Field.wrap(\\n 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b\\n )\\n ],\\n round_constant: [\\n [\\n Field.wrap(\\n 0x19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5\\n ),\\n Field.wrap(\\n 0x265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6\\n ),\\n Field.wrap(\\n 0x199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa\\n ),\\n Field.wrap(\\n 0x157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902\\n ),\\n Field.wrap(\\n 0x0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e\\n ),\\n Field.wrap(\\n 0x251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996\\n ),\\n Field.wrap(\\n 0x13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738\\n ),\\n Field.wrap(\\n 0x011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06\\n ),\\n Field.wrap(\\n 0x0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549\\n ),\\n Field.wrap(\\n 0x04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8\\n ),\\n Field.wrap(\\n 0x259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f\\n ),\\n Field.wrap(\\n 0x28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1\\n ),\\n Field.wrap(\\n 0x0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n ),\\n Field.wrap(\\n 0x0000000000000000000000000000000000000000000000000000000000000000\\n )\\n ],\\n [\\n Field.wrap(\\n 0x1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38\\n ),\\n Field.wrap(\\n 0x0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5\\n ),\\n Field.wrap(\\n 0x1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c\\n ),\\n Field.wrap(\\n 0x25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a\\n ),\\n Field.wrap(\\n 0x13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96\\n ),\\n Field.wrap(\\n 0x2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce\\n ),\\n Field.wrap(\\n 0x21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959\\n )\\n ],\\n [\\n Field.wrap(\\n 0x05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b\\n ),\\n Field.wrap(\\n 0x0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4\\n ),\\n Field.wrap(\\n 0x0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf\\n ),\\n Field.wrap(\\n 0x09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455\\n )\\n ],\\n [\\n Field.wrap(\\n 0x0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335\\n ),\\n Field.wrap(\\n 0x2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b\\n ),\\n Field.wrap(\\n 0x1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df\\n ),\\n Field.wrap(\\n 0x176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404\\n )\\n ]\\n ]\\n });\\n }\\n}\\n\",\"keccak256\":\"0x652b5b6944a7bd0e96b28edbaa3f327852eb9112a5efa4d581a5538adba60c29\",\"license\":\"UNLICENSED\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n}\\n\",\"keccak256\":\"0x7434453e6d3b7d0e5d0eb7846ffdbc27f0ccf3b163591263739b628074dc103a\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052600380546001600160401b03191690553480156200002157600080fd5b50604051620073f5380380620073f5833981016040819052620000449162002b54565b601062000055565b60405180910390fd5b60208163ffffffff161115620000b85760405162461bcd60e51b815260206004820152602160248201527f5f6c6576656c732073686f756c64206265206c657373207468616e20657120336044820152601960f91b60648201526084016200004c565b6000805463ffffffff191663ffffffff83161781555b8163ffffffff168163ffffffff1610156200011757620000f463ffffffff8216620001f9565b63ffffffff821660009081526001602081905260409091209190915501620000ce565b50620001356200012960018362002bd2565b63ffffffff16620001f9565b6000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5550600480546001600160a01b038087166001600160a01b03199283161790925560058054868416908316179055600680548584169216919091179055600380549183166801000000000000000002600160401b600160e01b0319909216919091179055620001ee7f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a62000855565b505050505062002e14565b6000816000036200020c57506000919050565b816001036200023c57507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b816002036200026c57507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b816003036200029c57507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403620002cc57507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503620002fc57507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b816006036200032c57507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b816007036200035c57507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b816008036200038c57507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903620003bc57507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03620003ec57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b036200041c57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c036200044c57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d036200047c57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e03620004ac57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f03620004dc57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b816010036200050c57507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036200053c57507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036200056c57507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b816013036200059c57507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b81601403620005cc57507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b81601503620005fc57507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036200062c57507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036200065c57507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b816018036200068c57507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b81601903620006bc57507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a03620006ec57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b036200071c57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036200074c57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036200077c57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e03620007ac57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f03620007dc57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b816020036200080c57507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016200004c565b60035460008054909163ffffffff6401000000009091048116916200087d9116600262002d22565b63ffffffff168163ffffffff1603620008f25760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201526f1d995cc818d85b88189948185919195960821b60648201526084016200004c565b8083600080805b60005463ffffffff90811690821610156200099f576200091b60028662002d4f565b63ffffffff166000036200095d578392506200093d63ffffffff8216620001f9565b63ffffffff82166000908152600160205260409020859055915062000979565b63ffffffff811660009081526001602052604090205492508391505b62000985838362000a32565b93506200099460028662002d75565b9450600101620008f9565b50600354600090601e90620009bc9063ffffffff16600162002d9b565b620009c8919062002d4f565b6003805463ffffffff191663ffffffff83169081179091556000908152600260205260409020859055905062000a0086600162002d9b565b6003805463ffffffff929092166401000000000263ffffffff60201b1990921691909117905550939695505050505050565b60408051600280825260608201835260009283929190602083019080368337019050509050838160008151811062000a6e5762000a6e62002dbb565b602002602001018181525050828160018151811062000a915762000a9162002dbb565b602090810291909101015262000ab562000aaa62000abf565b8260026000620020b1565b9150505b92915050565b62000ac962002a5d565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b600080620020d1620020ca86516200214d60201b60201c565b8762002153565b905060005b85518110156200212357848110156200211a576200211a86828151811062002102576200210262002dbb565b602002602001015183620021fa60201b90919060201c565b600101620020d6565b508215620021385762002138816001620021fa565b6200214381620022b8565b9695505050505050565b60401b90565b6200215d62002a86565b60006040518060c00160405280858152602001604051806060016040528060008152602001600081526020016000815250815260200160405180608001604052806000815260200160008152602001600081526020016000815250815260200160008152602001600015158152602001848152509050838160400151600360048110620021ee57620021ee62002dbb565b60200201529392505050565b816080015115801562002211575060038260600151145b156200223357620022228262002414565b506020820151526001606090910152565b81608001511580156200224b57506003826060015114155b1562002292578082602001518360600151600381106200226f576200226f62002dbb565b6020020152606082018051600191906200228b90839062002dd1565b9052505050565b816080015115620022b457602082015181905260016060830152600060808301525b5050565b600081608001518015620022ce57506060820151155b15620022e35760006080830181905260608301525b81608001516200235b576000620022fa8362002414565b60016080850152905060005b6003811015620023515781816003811062002325576200232562002dbb565b60200201518460200151826003811062002343576200234362002dbb565b602002015260010162002306565b5050600360608301525b60208201515160015b6003811015620023cf578360600151811015620023c6578360200151816003811062002394576200239462002dbb565b60200201518460200151600183620023ad919062002de7565b60038110620023c057620023c062002dbb565b60200201525b60010162002364565b50600183606001818151620023e5919062002de7565b90525060208301516060840151600091906003811062002409576200240962002dbb565b602002015292915050565b6200241e62002ace565b60005b6003811015620024615782606001518110620024585760008360200151826003811062002452576200245262002dbb565b60200201525b60010162002421565b5060005b6003811015620024dd57620024b6836020015182600381106200248c576200248c62002dbb565b602002015184604001518360048110620024aa57620024aa62002dbb565b60200201519062002574565b83604001518260048110620024cf57620024cf62002dbb565b602002015260010162002465565b50604082015160a08301518051602090910151620024fd929190620025a1565b6040808401919091528051606081018252600080825260208201819052918101829052905b60038110156200256d578360400151816004811062002545576200254562002dbb565b60200201518282600381106200255f576200255f62002dbb565b602002015260010162002522565b5092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b620025ab62002aec565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156200261e57858160048110620025f657620025f662002dbb565b602002015182826004811062002610576200261062002dbb565b6020020152600101620025d7565b506200262a816200273c565b60006200263a6002600862002dfd565b905060005b8181101562002674576200265583868362002852565b6200266083620028d4565b6200266b836200273c565b6001016200263f565b5060006200268460388362002dd1565b9050815b81811015620026e557620026b9868260408110620026aa57620026aa62002dbb565b602002015151856000620024aa565b8452620026ce8460005b60200201516200291d565b8452620026dc84886200294d565b60010162002688565b506000620026f66038600862002dd1565b9050815b818110156200272f576200271085888362002852565b6200271b85620028d4565b62002726856200273c565b600101620026fa565b5092979650505050505050565b6000620027538260016020020151836000620024aa565b905060006200276c8360036020020151846002620024aa565b90506000620027858460016020020151856001620024aa565b905062002793818362002574565b90506000620027ac8560036020020151866003620024aa565b9050620027ba818562002574565b90506000620027ca848062002574565b9050620027d8818062002574565b9050620027e6818362002574565b90506000620027f6868062002574565b905062002804818062002574565b905062002812818562002574565b9050600062002822848362002574565b9050600062002832868562002574565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015620028ce57620028ab83836040811062002878576200287862002dbb565b6020020151826004811062002891576200289162002dbb565b6020020151858360048110620024aa57620024aa62002dbb565b848260048110620028c057620028c062002dbb565b602002015260010162002855565b50505050565b60005b6004811015620022b457620028fa828260048110620026c357620026c362002dbb565b8282600481106200290f576200290f62002dbb565b6020020152600101620028d7565b6000806200292c838062002a30565b905062002946836200293f838062002a30565b9062002a30565b9392505050565b6000805b60048110156200298c576200298184826004811062002974576200297462002dbb565b6020020151839062002574565b915060010162002951565b5060005b6004811015620028ce57620029d9838260048110620029b357620029b362002dbb565b6020020151858360048110620029cd57620029cd62002dbb565b60200201519062002a30565b848260048110620029ee57620029ee62002dbb565b602002015262002a0d82858360048110620024aa57620024aa62002dbb565b84826004811062002a225762002a2262002dbb565b602002015260010162002990565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b604051806040016040528062002a7262002aec565b815260200162002a8162002b0a565b905290565b6040518060c001604052806000815260200162002aa262002ace565b815260200162002ab162002aec565b8152600060208201819052604082015260600162002a8162002a5d565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b62002b2462002aec565b81526020019060019003908162002b1a5790505090565b6001600160a01b038116811462002b5157600080fd5b50565b6000806000806080858703121562002b6b57600080fd5b845162002b788162002b3b565b602086015190945062002b8b8162002b3b565b604086015190935062002b9e8162002b3b565b606086015190925062002bb18162002b3b565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8281168282160390808211156200256d576200256d62002bbc565b600181815b8085111562002c35578163ffffffff0482111562002c195762002c1962002bbc565b8085161562002c2757918102915b93841c939080029062002bf7565b509250929050565b60008262002c4e5750600162000ab9565b8162002c5d5750600062000ab9565b816001811462002c76576002811462002c815762002cb9565b600191505062000ab9565b60ff84111562002c955762002c9562002bbc565b6001841b915063ffffffff82111562002cb25762002cb262002bbc565b5062000ab9565b5060208310610133831016604e8410600b841016171562002cf5575081810a63ffffffff81111562002cef5762002cef62002bbc565b62000ab9565b62002d01838362002bf2565b8063ffffffff0482111562002d1a5762002d1a62002bbc565b029392505050565b600063ffffffff62000ab581851682851662002c3d565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168062002d695762002d6962002d39565b92169190910692915050565b600063ffffffff8084168062002d8f5762002d8f62002d39565b92169190910492915050565b63ffffffff8181168382160190808211156200256d576200256d62002bbc565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000ab95762000ab962002bbc565b8181038181111562000ab95762000ab962002bbc565b60008262002e0f5762002e0f62002d39565b500490565b6145d18062002e246000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806390eeb02b116100e3578063c2b40ae41161008c578063e829558811610066578063e8295588146103f4578063f178e47c14610407578063fc7e9c6f1461042757600080fd5b8063c2b40ae4146103ac578063cd87a3b4146103cc578063e40af72e146103d457600080fd5b8063a6232a93116100bd578063a6232a9314610369578063aa0b7db71461037c578063ba70f7571461038f57600080fd5b806390eeb02b1461033157806395d1d7c71461034157806398754e0a1461035657600080fd5b8063404c8149116101455780634ecf518b1161011f5780634ecf518b146102c65780635ed86d5c146102eb578063738133dc146102fe57600080fd5b8063404c8149146102655780634b8ecb0e146102785780634c5eb6761461029f57600080fd5b806329648a971161017657806329648a97146101f257806329a2b3cf146102195780633e413bee1461023957600080fd5b80631202471514610192578063257671f5146101dc575b600080fd5b6004546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101e461043f565b6040519081526020016101d3565b6101e47f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb281565b6006546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6003546101b29068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610273366004613a80565b61046c565b6101e47f087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf81565b6101e47f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a81565b6000546102d69063ffffffff1681565b60405163ffffffff90911681526020016101d3565b6101b26102f9366004613a80565b61048d565b61032161030c366004613a80565b60076020526000908152604090205460ff1681565b60405190151581526020016101d3565b6003546102d69063ffffffff1681565b61035461034f366004613b69565b6104c8565b005b610354610364366004613c14565b610662565b610321610377366004613a80565b610cee565b61035461038a366004613cde565b610d77565b60035463ffffffff166000908152600260205260409020546101e4565b6101e46103ba366004613a80565b60026020526000908152604090205481565b6102d6601e81565b6005546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610402366004613a80565b610d87565b6101e4610415366004613a80565b60016020526000908152604090205481565b6003546102d690640100000000900463ffffffff1681565b60405161044e602082016139a2565b6020820181038252601f19601f820116604052508051906020012081565b6008818154811061047c57600080fd5b600091825260209091200154905081565b60006104c2826040516104a2602082016139a2565b6020820181038252601f19601f82011660405250805190602001206113c6565b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e4846104f0876113da565b6040518363ffffffff1660e01b815260040161050d929190613d2e565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e9190613dc6565b61059f5760405162461bcd60e51b815260206004820152601560248201527f6861736832207a6b2070726f6f66206661696c6564000000000000000000000060448201526064015b60405180910390fd5b60006105aa85611421565b6040517f02cba74100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015230602483015260448201899052919250908216906302cba741906064016020604051808303816000875af1158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190613dc6565b50610659868484611589565b50505050505050565b6106858160008151811061067857610678613de8565b6020026020010151610cee565b6106d15760405162461bcd60e51b815260206004820152601560248201527f4465706f7369747320726f6f7420756e6b6e6f776e00000000000000000000006044820152606401610596565b6000806106f7836001815181106106ea576106ea613de8565b60200260200101516116f9565b915091506107487f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460038151811061073257610732613de8565b602002602001015161176690919063ffffffff16565b61086857600760008460038151811061076357610763613de8565b60209081029190910181015182528101919091526040016000205460ff16156107ce5760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b600160076000856003815181106107e7576107e7613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360038151811061084857610848613de8565b602002602001015160405161085f91815260200190565b60405180910390a15b61089f7f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460048151811061073257610732613de8565b6109bf5760076000846004815181106108ba576108ba613de8565b60209081029190910181015182528101919091526040016000205460ff16156109255760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b6001600760008560048151811061093e5761093e613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360048151811061099f5761099f613de8565b60200260200101516040516109b691815260200190565b60405180910390a15b60045473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e485856040518363ffffffff1660e01b81526004016109fc929190613d2e565b602060405180830381865afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613dc6565b610a895760405162461bcd60e51b815260206004820152601a60248201527f73706c6974206a6f696e207a6b2070726f6f66206661696c65640000000000006044820152606401610596565b7ff234da3258dbf8e5a4e39e1acffc5d2bedbd437738faf277c46c20c6556a0b2e83600481518110610abd57610abd613de8565b6020026020010151604051610ad491815260200190565b60405180910390a1600883600481518110610af157610af1613de8565b602090810291909101810151825460018101845560009384529190922001558251610b369084906004908110610b2957610b29613de8565b602002602001015161176a565b508115610bef576003546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af1158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613dc6565b50610ce8565b600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c5085600281518110610c4357610c43613de8565b6020026020010151611971565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190613dc6565b505b50505050565b600081610cfd57506000919050565b60035463ffffffff16805b63ffffffff808216600090815260026020526040902054610d2c9186919061176616565b15610d3b575060019392505050565b8063ffffffff16600003610d4d5750601e5b80610d5781613e46565b9150508163ffffffff168163ffffffff1603610d08575060009392505050565b610d82838383611589565b505050565b600081600003610d9957506000919050565b81600103610dc857507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b81600203610df757507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b81600303610e2657507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403610e5557507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503610e8457507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b81600603610eb357507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b81600703610ee257507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b81600803610f1157507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903610f4057507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03610f6f57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b03610f9e57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c03610fcd57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d03610ffc57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e0361102b57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f0361105a57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b8160100361108957507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036110b857507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036110e757507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b8160130361111657507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b8160140361114557507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b8160150361117457507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036111a357507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036111d257507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b8160180361120157507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b8160190361123057507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a0361125f57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b0361128e57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036112bd57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036112ec57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e0361131b57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f0361134a57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b8160200361137957507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610596565b919050565b60006113d38383306119db565b9392505050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061141057611410613de8565b602002602001018181525050919050565b60008061143883604051806020016104a2906139a2565b9050803b600081900361158257600060405180602001611457906139a2565b6020820181038252601f19601f8201166040525090506000858251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115045760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574466163746f72793a206661696c656420746f206465706c6f792060448201527f77616c6c657400000000000000000000000000000000000000000000000000006064820152608401610596565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461157f5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574466163746f72793a206465706c6f79206d69736d6174636800006044820152606401610596565b50505b5092915050565b6040805160028082526060820183526000926020830190803683370190505090506115b384611a05565b816000815181106115c6576115c6613de8565b60200260200101818152505082816001815181106115e6576115e6613de8565b602090810291909101015260065473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e483836040518363ffffffff1660e01b815260040161162e929190613d2e565b602060405180830381865afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190613dc6565b6116bb5760405162461bcd60e51b815260206004820152601460248201527f6e6f7465207a6b2070726f6f66206661696c65640000000000000000000000006044820152606401610596565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301839055610ce68361176a565b600080827f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f800000081111561175b576000611751827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001613e84565b9250925050915091565b600194909350915050565b1490565b60035460008054909163ffffffff64010000000090910481169161179091166002613fa8565b63ffffffff168163ffffffff16036118105760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201527f7665732063616e206265206164646564000000000000000000000000000000006064820152608401610596565b8083600080805b60005463ffffffff90811690821610156118b157611836600286613fec565b63ffffffff16600003611874578392506118558163ffffffff16610d87565b63ffffffff821660009081526001602052604090208590559150611890565b63ffffffff811660009081526001602052604090205492508391505b61189a8383611a0f565b93506118a760028661400f565b9450600101611817565b50600354600090601e906118cc9063ffffffff166001614032565b6118d69190613fec565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff831690811790915560009081526002602052604090208590559050611927866001614032565b6003805463ffffffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905550939695505050505050565b60007401000000000000000000000000000000000000000082106119d75760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b5090565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b806113c181611a91565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110611a4857611a48613de8565b6020026020010181815250508281600181518110611a6857611a68613de8565b602002602001018181525050611a89611a7f611b03565b82600260006130f3565b949350505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110611b005760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b50565b611b0b6139af565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b60008061310a613104865160401b90565b87613179565b905060005b8551811015613154578481101561314c5761314c86828151811061313557613135613de8565b60200260200101518361321b90919063ffffffff16565b60010161310f565b5082156131665761316681600161321b565b61316f816132cd565b9695505050505050565b6131816139d4565b60006040518060c0016040528085815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060800160405280600081526020016000815260200160008152602001600081525081526020016000815260200160001515815260200184815250905083816040015160036004811061320f5761320f613de8565b60200201529392505050565b8160800151158015613231575060038260600151145b156132505761323f8261340c565b506020820151526001606090910152565b816080015115801561326757506003826060015114155b156132a85780826020015183606001516003811061328757613287613de8565b6020020152606082018051600191906132a190839061404f565b9052505050565b8160800151156132c957602082015181905260016060830152600060808301525b5050565b6000816080015180156132e257506060820151155b156132f65760006080830181905260608301525b816080015161336357600061330a8361340c565b60016080850152905060005b60038110156133595781816003811061333157613331613de8565b60200201518460200151826003811061334c5761334c613de8565b6020020152600101613316565b5050600360608301525b60208201515160015b60038110156133cc5783606001518110156133c4578360200151816003811061339757613397613de8565b602002015184602001516001836133ae9190613e84565b600381106133be576133be613de8565b60200201525b60010161336c565b506001836060018181516133e09190613e84565b90525060208301516060840151600091906003811061340157613401613de8565b602002015292915050565b613414613a16565b60005b600381101561345157826060015181106134495760008360200151826003811061344357613443613de8565b60200201525b600101613417565b5060005b60038110156134c05761349d8360200151826003811061347757613477613de8565b60200201518460400151836004811061349257613492613de8565b602002015190613548565b836040015182600481106134b3576134b3613de8565b6020020152600101613455565b506134e082604001518360a00151600001518460a0015160200151613575565b6040808401919091528051606081018252600080825260208201819052918101829052905b6003811015611582578360400151816004811061352457613524613de8565b602002015182826003811061353b5761353b613de8565b6020020152600101613505565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b61357d613a34565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156135e8578581600481106135c4576135c4613de8565b60200201518282600481106135db576135db613de8565b60200201526001016135a9565b506135f2816136e3565b600061360060026008614062565b905060005b81811015613632576136188386836137dd565b6136218361384a565b61362a836136e3565b600101613605565b50600061364060388361404f565b9050815b818110156136965761366f86826040811061366157613661613de8565b602002015151856000613492565b84526136828460005b602002015161388a565b845261368e84886138ad565b600101613644565b5060006136a56038600861404f565b9050815b818110156136d6576136bc8588836137dd565b6136c58561384a565b6136ce856136e3565b6001016136a9565b5092979650505050505050565b60006136f88260016020020151836000613492565b9050600061370f8360036020020151846002613492565b905060006137268460016020020151856001613492565b90506137328183613548565b905060006137498560036020020151866003613492565b90506137558185613548565b905060006137638480613548565b905061376f8180613548565b905061377b8183613548565b905060006137898680613548565b90506137958180613548565b90506137a18185613548565b905060006137af8483613548565b905060006137bd8685613548565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015610ce85761382b8383604081106137fe576137fe613de8565b6020020151826004811061381457613814613de8565b602002015185836004811061349257613492613de8565b84826004811061383d5761383d613de8565b60200201526001016137e0565b60005b60048110156132c95761386b82826004811061367857613678613de8565b82826004811061387d5761387d613de8565b602002015260010161384d565b6000806138978380613975565b90506113d3836138a78380613975565b90613975565b6000805b60048110156138e5576138db8482600481106138cf576138cf613de8565b60200201518390613548565b91506001016138b1565b5060005b6004811015610ce85761392983826004811061390757613907613de8565b602002015185836004811061391e5761391e613de8565b602002015190613975565b84826004811061393b5761393b613de8565b60200201526139568285836004811061349257613492613de8565b84826004811061396857613968613de8565b60200201526001016138e9565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b6105258061407783390190565b60405180604001604052806139c2613a34565b81526020016139cf613a52565b905290565b6040518060c00160405280600081526020016139ee613a16565b81526020016139fb613a34565b815260006020820181905260408201526060016139cf6139af565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b613a6a613a34565b815260200190600190039081613a625790505090565b600060208284031215613a9257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613af157613af1613a99565b604052919050565b600082601f830112613b0a57600080fd5b813567ffffffffffffffff811115613b2457613b24613a99565b613b376020601f19601f84011601613ac8565b818152846020838601011115613b4c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b8257600080fd5b863573ffffffffffffffffffffffffffffffffffffffff81168114613ba657600080fd5b95506020870135945060408701359350606087013567ffffffffffffffff80821115613bd157600080fd5b613bdd8a838b01613af9565b94506080890135935060a0890135915080821115613bfa57600080fd5b50613c0789828a01613af9565b9150509295509295509295565b60008060408385031215613c2757600080fd5b823567ffffffffffffffff80821115613c3f57600080fd5b613c4b86838701613af9565b9350602091508185013581811115613c6257600080fd5b8501601f81018713613c7357600080fd5b803582811115613c8557613c85613a99565b8060051b9250613c96848401613ac8565b8181529282018401928481019089851115613cb057600080fd5b928501925b84841015613cce57833582529285019290850190613cb5565b8096505050505050509250929050565b600080600060608486031215613cf357600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613d1857600080fd5b613d2486828701613af9565b9150509250925092565b604081526000835180604084015260005b81811015613d5c5760208187018101516060868401015201613d3f565b50600060608285010152601f19601f820116830190506060810160206060858403016020860152818651808452608085019150602088019450600093505b80841015613dba5784518252938201936001939093019290820190613d9a565b50979650505050505050565b600060208284031215613dd857600080fd5b815180151581146113d357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff821680613e5c57613e5c613e17565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b818103818111156104c2576104c2613e17565b600181815b80851115613ed4578163ffffffff04821115613eba57613eba613e17565b80851615613ec757918102915b93841c9390800290613e9c565b509250929050565b600082613eeb575060016104c2565b81613ef8575060006104c2565b8160018114613f0e5760028114613f1857613f49565b60019150506104c2565b60ff841115613f2957613f29613e17565b6001841b915063ffffffff821115613f4357613f43613e17565b506104c2565b5060208310610133831016604e8410600b8410161715613f80575081810a63ffffffff811115613f7b57613f7b613e17565b6104c2565b613f8a8383613e97565b8063ffffffff04821115613fa057613fa0613e17565b029392505050565b600063ffffffff611a89818516828516613edc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff8084168061400357614003613fbd565b92169190910692915050565b600063ffffffff8084168061402657614026613fbd565b92169190910492915050565b63ffffffff81811683821601908082111561158257611582613e17565b808201808211156104c2576104c2613e17565b60008261407157614071613fbd565b50049056fe608060405234801561001057600080fd5b50600080546001600160a01b031916331790556104f3806100326000396000f3fe6080604052600436106100385760003560e01c806302cba7411461004457806316f0115b146100795780636dbf2fa0146100cb57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b5061006461005f366004610343565b6100f9565b60405190151581526020015b60405180910390f35b34801561008557600080fd5b506000546100a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610070565b3480156100d757600080fd5b506100eb6100e6366004610384565b610221565b60405161007092919061040d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f7279000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190610484565b949350505050565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f727900000000000000000000000000000000000000006044820152606401610177565b8573ffffffffffffffffffffffffffffffffffffffff168585856040516102ce9291906104ad565b60006040518083038185875af1925050503d806000811461030b576040519150601f19603f3d011682016040523d82523d6000602084013e610310565b606091505b509097909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461034057600080fd5b50565b60008060006060848603121561035857600080fd5b83356103638161031e565b925060208401356103738161031e565b929592945050506040919091013590565b6000806000806060858703121561039a57600080fd5b84356103a58161031e565b935060208501359250604085013567ffffffffffffffff808211156103c957600080fd5b818701915087601f8301126103dd57600080fd5b8135818111156103ec57600080fd5b8860208285010111156103fe57600080fd5b95989497505060200194505050565b82151581526000602060406020840152835180604085015260005b8181101561044457858101830151858201606001528201610428565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b60006020828403121561049657600080fd5b815180151581146104a657600080fd5b9392505050565b818382376000910190815291905056fea264697066735822122077d983d5508d9e74f5dae069d8f0aecc88f28aca3bd682f0f947621364292a9b64736f6c63430008180033a2646970667358221220ee6da2c5d6480ae3f7b23516a9047af64a4cb73eb22cae0ddef8918b8d20f56564736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806390eeb02b116100e3578063c2b40ae41161008c578063e829558811610066578063e8295588146103f4578063f178e47c14610407578063fc7e9c6f1461042757600080fd5b8063c2b40ae4146103ac578063cd87a3b4146103cc578063e40af72e146103d457600080fd5b8063a6232a93116100bd578063a6232a9314610369578063aa0b7db71461037c578063ba70f7571461038f57600080fd5b806390eeb02b1461033157806395d1d7c71461034157806398754e0a1461035657600080fd5b8063404c8149116101455780634ecf518b1161011f5780634ecf518b146102c65780635ed86d5c146102eb578063738133dc146102fe57600080fd5b8063404c8149146102655780634b8ecb0e146102785780634c5eb6761461029f57600080fd5b806329648a971161017657806329648a97146101f257806329a2b3cf146102195780633e413bee1461023957600080fd5b80631202471514610192578063257671f5146101dc575b600080fd5b6004546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101e461043f565b6040519081526020016101d3565b6101e47f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb281565b6006546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6003546101b29068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610273366004613a80565b61046c565b6101e47f087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf81565b6101e47f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a81565b6000546102d69063ffffffff1681565b60405163ffffffff90911681526020016101d3565b6101b26102f9366004613a80565b61048d565b61032161030c366004613a80565b60076020526000908152604090205460ff1681565b60405190151581526020016101d3565b6003546102d69063ffffffff1681565b61035461034f366004613b69565b6104c8565b005b610354610364366004613c14565b610662565b610321610377366004613a80565b610cee565b61035461038a366004613cde565b610d77565b60035463ffffffff166000908152600260205260409020546101e4565b6101e46103ba366004613a80565b60026020526000908152604090205481565b6102d6601e81565b6005546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610402366004613a80565b610d87565b6101e4610415366004613a80565b60016020526000908152604090205481565b6003546102d690640100000000900463ffffffff1681565b60405161044e602082016139a2565b6020820181038252601f19601f820116604052508051906020012081565b6008818154811061047c57600080fd5b600091825260209091200154905081565b60006104c2826040516104a2602082016139a2565b6020820181038252601f19601f82011660405250805190602001206113c6565b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e4846104f0876113da565b6040518363ffffffff1660e01b815260040161050d929190613d2e565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e9190613dc6565b61059f5760405162461bcd60e51b815260206004820152601560248201527f6861736832207a6b2070726f6f66206661696c6564000000000000000000000060448201526064015b60405180910390fd5b60006105aa85611421565b6040517f02cba74100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015230602483015260448201899052919250908216906302cba741906064016020604051808303816000875af1158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190613dc6565b50610659868484611589565b50505050505050565b6106858160008151811061067857610678613de8565b6020026020010151610cee565b6106d15760405162461bcd60e51b815260206004820152601560248201527f4465706f7369747320726f6f7420756e6b6e6f776e00000000000000000000006044820152606401610596565b6000806106f7836001815181106106ea576106ea613de8565b60200260200101516116f9565b915091506107487f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460038151811061073257610732613de8565b602002602001015161176690919063ffffffff16565b61086857600760008460038151811061076357610763613de8565b60209081029190910181015182528101919091526040016000205460ff16156107ce5760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b600160076000856003815181106107e7576107e7613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360038151811061084857610848613de8565b602002602001015160405161085f91815260200190565b60405180910390a15b61089f7f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460048151811061073257610732613de8565b6109bf5760076000846004815181106108ba576108ba613de8565b60209081029190910181015182528101919091526040016000205460ff16156109255760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b6001600760008560048151811061093e5761093e613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360048151811061099f5761099f613de8565b60200260200101516040516109b691815260200190565b60405180910390a15b60045473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e485856040518363ffffffff1660e01b81526004016109fc929190613d2e565b602060405180830381865afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613dc6565b610a895760405162461bcd60e51b815260206004820152601a60248201527f73706c6974206a6f696e207a6b2070726f6f66206661696c65640000000000006044820152606401610596565b7ff234da3258dbf8e5a4e39e1acffc5d2bedbd437738faf277c46c20c6556a0b2e83600481518110610abd57610abd613de8565b6020026020010151604051610ad491815260200190565b60405180910390a1600883600481518110610af157610af1613de8565b602090810291909101810151825460018101845560009384529190922001558251610b369084906004908110610b2957610b29613de8565b602002602001015161176a565b508115610bef576003546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af1158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613dc6565b50610ce8565b600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c5085600281518110610c4357610c43613de8565b6020026020010151611971565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190613dc6565b505b50505050565b600081610cfd57506000919050565b60035463ffffffff16805b63ffffffff808216600090815260026020526040902054610d2c9186919061176616565b15610d3b575060019392505050565b8063ffffffff16600003610d4d5750601e5b80610d5781613e46565b9150508163ffffffff168163ffffffff1603610d08575060009392505050565b610d82838383611589565b505050565b600081600003610d9957506000919050565b81600103610dc857507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b81600203610df757507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b81600303610e2657507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403610e5557507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503610e8457507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b81600603610eb357507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b81600703610ee257507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b81600803610f1157507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903610f4057507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03610f6f57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b03610f9e57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c03610fcd57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d03610ffc57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e0361102b57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f0361105a57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b8160100361108957507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036110b857507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036110e757507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b8160130361111657507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b8160140361114557507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b8160150361117457507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036111a357507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036111d257507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b8160180361120157507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b8160190361123057507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a0361125f57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b0361128e57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036112bd57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036112ec57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e0361131b57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f0361134a57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b8160200361137957507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610596565b919050565b60006113d38383306119db565b9392505050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061141057611410613de8565b602002602001018181525050919050565b60008061143883604051806020016104a2906139a2565b9050803b600081900361158257600060405180602001611457906139a2565b6020820181038252601f19601f8201166040525090506000858251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115045760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574466163746f72793a206661696c656420746f206465706c6f792060448201527f77616c6c657400000000000000000000000000000000000000000000000000006064820152608401610596565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461157f5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574466163746f72793a206465706c6f79206d69736d6174636800006044820152606401610596565b50505b5092915050565b6040805160028082526060820183526000926020830190803683370190505090506115b384611a05565b816000815181106115c6576115c6613de8565b60200260200101818152505082816001815181106115e6576115e6613de8565b602090810291909101015260065473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e483836040518363ffffffff1660e01b815260040161162e929190613d2e565b602060405180830381865afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190613dc6565b6116bb5760405162461bcd60e51b815260206004820152601460248201527f6e6f7465207a6b2070726f6f66206661696c65640000000000000000000000006044820152606401610596565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301839055610ce68361176a565b600080827f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f800000081111561175b576000611751827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001613e84565b9250925050915091565b600194909350915050565b1490565b60035460008054909163ffffffff64010000000090910481169161179091166002613fa8565b63ffffffff168163ffffffff16036118105760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201527f7665732063616e206265206164646564000000000000000000000000000000006064820152608401610596565b8083600080805b60005463ffffffff90811690821610156118b157611836600286613fec565b63ffffffff16600003611874578392506118558163ffffffff16610d87565b63ffffffff821660009081526001602052604090208590559150611890565b63ffffffff811660009081526001602052604090205492508391505b61189a8383611a0f565b93506118a760028661400f565b9450600101611817565b50600354600090601e906118cc9063ffffffff166001614032565b6118d69190613fec565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff831690811790915560009081526002602052604090208590559050611927866001614032565b6003805463ffffffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905550939695505050505050565b60007401000000000000000000000000000000000000000082106119d75760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b5090565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b806113c181611a91565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110611a4857611a48613de8565b6020026020010181815250508281600181518110611a6857611a68613de8565b602002602001018181525050611a89611a7f611b03565b82600260006130f3565b949350505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110611b005760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b50565b611b0b6139af565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b60008061310a613104865160401b90565b87613179565b905060005b8551811015613154578481101561314c5761314c86828151811061313557613135613de8565b60200260200101518361321b90919063ffffffff16565b60010161310f565b5082156131665761316681600161321b565b61316f816132cd565b9695505050505050565b6131816139d4565b60006040518060c0016040528085815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060800160405280600081526020016000815260200160008152602001600081525081526020016000815260200160001515815260200184815250905083816040015160036004811061320f5761320f613de8565b60200201529392505050565b8160800151158015613231575060038260600151145b156132505761323f8261340c565b506020820151526001606090910152565b816080015115801561326757506003826060015114155b156132a85780826020015183606001516003811061328757613287613de8565b6020020152606082018051600191906132a190839061404f565b9052505050565b8160800151156132c957602082015181905260016060830152600060808301525b5050565b6000816080015180156132e257506060820151155b156132f65760006080830181905260608301525b816080015161336357600061330a8361340c565b60016080850152905060005b60038110156133595781816003811061333157613331613de8565b60200201518460200151826003811061334c5761334c613de8565b6020020152600101613316565b5050600360608301525b60208201515160015b60038110156133cc5783606001518110156133c4578360200151816003811061339757613397613de8565b602002015184602001516001836133ae9190613e84565b600381106133be576133be613de8565b60200201525b60010161336c565b506001836060018181516133e09190613e84565b90525060208301516060840151600091906003811061340157613401613de8565b602002015292915050565b613414613a16565b60005b600381101561345157826060015181106134495760008360200151826003811061344357613443613de8565b60200201525b600101613417565b5060005b60038110156134c05761349d8360200151826003811061347757613477613de8565b60200201518460400151836004811061349257613492613de8565b602002015190613548565b836040015182600481106134b3576134b3613de8565b6020020152600101613455565b506134e082604001518360a00151600001518460a0015160200151613575565b6040808401919091528051606081018252600080825260208201819052918101829052905b6003811015611582578360400151816004811061352457613524613de8565b602002015182826003811061353b5761353b613de8565b6020020152600101613505565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b61357d613a34565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156135e8578581600481106135c4576135c4613de8565b60200201518282600481106135db576135db613de8565b60200201526001016135a9565b506135f2816136e3565b600061360060026008614062565b905060005b81811015613632576136188386836137dd565b6136218361384a565b61362a836136e3565b600101613605565b50600061364060388361404f565b9050815b818110156136965761366f86826040811061366157613661613de8565b602002015151856000613492565b84526136828460005b602002015161388a565b845261368e84886138ad565b600101613644565b5060006136a56038600861404f565b9050815b818110156136d6576136bc8588836137dd565b6136c58561384a565b6136ce856136e3565b6001016136a9565b5092979650505050505050565b60006136f88260016020020151836000613492565b9050600061370f8360036020020151846002613492565b905060006137268460016020020151856001613492565b90506137328183613548565b905060006137498560036020020151866003613492565b90506137558185613548565b905060006137638480613548565b905061376f8180613548565b905061377b8183613548565b905060006137898680613548565b90506137958180613548565b90506137a18185613548565b905060006137af8483613548565b905060006137bd8685613548565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015610ce85761382b8383604081106137fe576137fe613de8565b6020020151826004811061381457613814613de8565b602002015185836004811061349257613492613de8565b84826004811061383d5761383d613de8565b60200201526001016137e0565b60005b60048110156132c95761386b82826004811061367857613678613de8565b82826004811061387d5761387d613de8565b602002015260010161384d565b6000806138978380613975565b90506113d3836138a78380613975565b90613975565b6000805b60048110156138e5576138db8482600481106138cf576138cf613de8565b60200201518390613548565b91506001016138b1565b5060005b6004811015610ce85761392983826004811061390757613907613de8565b602002015185836004811061391e5761391e613de8565b602002015190613975565b84826004811061393b5761393b613de8565b60200201526139568285836004811061349257613492613de8565b84826004811061396857613968613de8565b60200201526001016138e9565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b6105258061407783390190565b60405180604001604052806139c2613a34565b81526020016139cf613a52565b905290565b6040518060c00160405280600081526020016139ee613a16565b81526020016139fb613a34565b815260006020820181905260408201526060016139cf6139af565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b613a6a613a34565b815260200190600190039081613a625790505090565b600060208284031215613a9257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613af157613af1613a99565b604052919050565b600082601f830112613b0a57600080fd5b813567ffffffffffffffff811115613b2457613b24613a99565b613b376020601f19601f84011601613ac8565b818152846020838601011115613b4c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b8257600080fd5b863573ffffffffffffffffffffffffffffffffffffffff81168114613ba657600080fd5b95506020870135945060408701359350606087013567ffffffffffffffff80821115613bd157600080fd5b613bdd8a838b01613af9565b94506080890135935060a0890135915080821115613bfa57600080fd5b50613c0789828a01613af9565b9150509295509295509295565b60008060408385031215613c2757600080fd5b823567ffffffffffffffff80821115613c3f57600080fd5b613c4b86838701613af9565b9350602091508185013581811115613c6257600080fd5b8501601f81018713613c7357600080fd5b803582811115613c8557613c85613a99565b8060051b9250613c96848401613ac8565b8181529282018401928481019089851115613cb057600080fd5b928501925b84841015613cce57833582529285019290850190613cb5565b8096505050505050509250929050565b600080600060608486031215613cf357600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613d1857600080fd5b613d2486828701613af9565b9150509250925092565b604081526000835180604084015260005b81811015613d5c5760208187018101516060868401015201613d3f565b50600060608285010152601f19601f820116830190506060810160206060858403016020860152818651808452608085019150602088019450600093505b80841015613dba5784518252938201936001939093019290820190613d9a565b50979650505050505050565b600060208284031215613dd857600080fd5b815180151581146113d357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff821680613e5c57613e5c613e17565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b818103818111156104c2576104c2613e17565b600181815b80851115613ed4578163ffffffff04821115613eba57613eba613e17565b80851615613ec757918102915b93841c9390800290613e9c565b509250929050565b600082613eeb575060016104c2565b81613ef8575060006104c2565b8160018114613f0e5760028114613f1857613f49565b60019150506104c2565b60ff841115613f2957613f29613e17565b6001841b915063ffffffff821115613f4357613f43613e17565b506104c2565b5060208310610133831016604e8410600b8410161715613f80575081810a63ffffffff811115613f7b57613f7b613e17565b6104c2565b613f8a8383613e97565b8063ffffffff04821115613fa057613fa0613e17565b029392505050565b600063ffffffff611a89818516828516613edc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff8084168061400357614003613fbd565b92169190910692915050565b600063ffffffff8084168061402657614026613fbd565b92169190910492915050565b63ffffffff81811683821601908082111561158257611582613e17565b808201808211156104c2576104c2613e17565b60008261407157614071613fbd565b50049056fe608060405234801561001057600080fd5b50600080546001600160a01b031916331790556104f3806100326000396000f3fe6080604052600436106100385760003560e01c806302cba7411461004457806316f0115b146100795780636dbf2fa0146100cb57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b5061006461005f366004610343565b6100f9565b60405190151581526020015b60405180910390f35b34801561008557600080fd5b506000546100a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610070565b3480156100d757600080fd5b506100eb6100e6366004610384565b610221565b60405161007092919061040d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f7279000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190610484565b949350505050565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f727900000000000000000000000000000000000000006044820152606401610177565b8573ffffffffffffffffffffffffffffffffffffffff168585856040516102ce9291906104ad565b60006040518083038185875af1925050503d806000811461030b576040519150601f19603f3d011682016040523d82523d6000602084013e610310565b606091505b509097909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461034057600080fd5b50565b60008060006060848603121561035857600080fd5b83356103638161031e565b925060208401356103738161031e565b929592945050506040919091013590565b6000806000806060858703121561039a57600080fd5b84356103a58161031e565b935060208501359250604085013567ffffffffffffffff808211156103c957600080fd5b818701915087601f8301126103dd57600080fd5b8135818111156103ec57600080fd5b8860208285010111156103fe57600080fd5b95989497505060200194505050565b82151581526000602060406020840152835180604085015260005b8181101561044457858101830151858201606001528201610428565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b60006020828403121561049657600080fd5b815180151581146104a657600080fd5b9392505050565b818382376000910190815291905056fea264697066735822122077d983d5508d9e74f5dae069d8f0aecc88f28aca3bd682f0f947621364292a9b64736f6c63430008180033a2646970667358221220ee6da2c5d6480ae3f7b23516a9047af64a4cb73eb22cae0ddef8918b8d20f56564736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "getLastRoot()": { + "details": "Returns the last root" + }, + "isKnownRoot(uint256)": { + "details": "Whether the root is present in the root history" + }, + "zeros(uint256)": { + "details": "provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels" + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 4217, + "contract": "contracts/Pool.sol:Pool", + "label": "levels", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 4222, + "contract": "contracts/Pool.sol:Pool", + "label": "filledSubtrees", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_userDefinedValueType(Field)5523)" + }, + { + "astId": 4227, + "contract": "contracts/Pool.sol:Pool", + "label": "roots", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_userDefinedValueType(Field)5523)" + }, + { + "astId": 4233, + "contract": "contracts/Pool.sol:Pool", + "label": "currentRootIndex", + "offset": 0, + "slot": "3", + "type": "t_uint32" + }, + { + "astId": 4236, + "contract": "contracts/Pool.sol:Pool", + "label": "nextIndex", + "offset": 4, + "slot": "3", + "type": "t_uint32" + }, + { + "astId": 4875, + "contract": "contracts/Pool.sol:Pool", + "label": "usdc", + "offset": 8, + "slot": "3", + "type": "t_contract(IERC20)729" + }, + { + "astId": 4878, + "contract": "contracts/Pool.sol:Pool", + "label": "splitJoinVerifier", + "offset": 0, + "slot": "4", + "type": "t_contract(SplitJoin16Verifier)5510" + }, + { + "astId": 4881, + "contract": "contracts/Pool.sol:Pool", + "label": "hash2Verifier", + "offset": 0, + "slot": "5", + "type": "t_contract(Hash2Verifier)5516" + }, + { + "astId": 4884, + "contract": "contracts/Pool.sol:Pool", + "label": "noteVerifier", + "offset": 0, + "slot": "6", + "type": "t_contract(NoteVerifier)5519" + }, + { + "astId": 4889, + "contract": "contracts/Pool.sol:Pool", + "label": "isNoteSpent", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_userDefinedValueType(Field)5523,t_bool)" + }, + { + "astId": 4893, + "contract": "contracts/Pool.sol:Pool", + "label": "noteCommitments", + "offset": 0, + "slot": "8", + "type": "t_array(t_userDefinedValueType(Field)5523)dyn_storage" + } + ], + "types": { + "t_array(t_userDefinedValueType(Field)5523)dyn_storage": { + "base": "t_userDefinedValueType(Field)5523", + "encoding": "dynamic_array", + "label": "Field[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(Hash2Verifier)5516": { + "encoding": "inplace", + "label": "contract Hash2Verifier", + "numberOfBytes": "20" + }, + "t_contract(IERC20)729": { + "encoding": "inplace", + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(NoteVerifier)5519": { + "encoding": "inplace", + "label": "contract NoteVerifier", + "numberOfBytes": "20" + }, + "t_contract(SplitJoin16Verifier)5510": { + "encoding": "inplace", + "label": "contract SplitJoin16Verifier", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_userDefinedValueType(Field)5523)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => Field)", + "numberOfBytes": "32", + "value": "t_userDefinedValueType(Field)5523" + }, + "t_mapping(t_userDefinedValueType(Field)5523,t_bool)": { + "encoding": "mapping", + "key": "t_userDefinedValueType(Field)5523", + "label": "mapping(Field => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_userDefinedValueType(Field)5523": { + "encoding": "inplace", + "label": "Field", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/SplitJoin16Verifier.json b/src/contracts/deployments/sepolia/SplitJoin16Verifier.json new file mode 100644 index 0000000..b06f9e3 --- /dev/null +++ b/src/contracts/deployments/sepolia/SplitJoin16Verifier.json @@ -0,0 +1,148 @@ +{ + "address": "0x4298B6a7E18A55996697DDD009BbD5BeEADF199F", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x3735d1d8e98d7a321968461b90b0ca7d481941a0306b715ced7562bb3ffd9598", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0x4298B6a7E18A55996697DDD009BbD5BeEADF199F", + "transactionIndex": 69, + "gasUsed": "2581080", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xccf1ca16923615253eefc905d5564a215302d67c1b5247f2ff054d8e451e18e6", + "transactionHash": "0x3735d1d8e98d7a321968461b90b0ca7d481941a0306b715ced7562bb3ffd9598", + "logs": [], + "blockNumber": 5498372, + "cumulativeGasUsed": "14943634", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"SplitJoin16Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af457637e5769bf60e01b60005260046000fd5b5050612ceb80610b056000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed381526020015b60405180910390f35b61008161007c366004612bf0565b610091565b6040519015158152602001610065565b6180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300526103a0518281146108a0576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1b576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d15577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edb57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9c565b50505080610f0d577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f49578483840992508001610f34565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f80578483840992508001610f6b565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611076577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce7576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d21576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d82576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de3576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e47576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eaf576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f17576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7f576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe7576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204f576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b7576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128af577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e5576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612943576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa45761340051613420518582830986600388838609088783840914612a00576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4e576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad4577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be2577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0657600080fd5b843567ffffffffffffffff80821115612c1e57600080fd5b818701915087601f830112612c3257600080fd5b813581811115612c4157600080fd5b886020828501011115612c5357600080fd5b602092830196509450908601359080821115612c6e57600080fd5b818701915087601f830112612c8257600080fd5b813581811115612c9157600080fd5b8860208260051b8501011115612ca657600080fd5b9598949750506020019450505056fea2646970667358221220fe40f32326550f06de5c9e39eae7c73c13c432d89867bf72e452efe813956e1864736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed381526020015b60405180910390f35b61008161007c366004612bf0565b610091565b6040519015158152602001610065565b6180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300526103a0518281146108a0576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1b576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d15577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edb57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9c565b50505080610f0d577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f49578483840992508001610f34565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f80578483840992508001610f6b565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611076577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce7576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d21576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d82576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de3576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e47576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eaf576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f17576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7f576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe7576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204f576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b7576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128af577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e5576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612943576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa45761340051613420518582830986600388838609088783840914612a00576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4e576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad4577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be2577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0657600080fd5b843567ffffffffffffffff80821115612c1e57600080fd5b818701915087601f830112612c3257600080fd5b813581811115612c4157600080fd5b886020828501011115612c5357600080fd5b602092830196509450908601359080821115612c6e57600080fd5b818701915087601f830112612c8257600080fd5b813581811115612c9157600080fd5b8860208260051b8501011115612ca657600080fd5b9598949750506020019450505056fea2646970667358221220fe40f32326550f06de5c9e39eae7c73c13c432d89867bf72e452efe813956e1864736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/SplitJoin32Verifier.json b/src/contracts/deployments/sepolia/SplitJoin32Verifier.json new file mode 100644 index 0000000..e2a513c --- /dev/null +++ b/src/contracts/deployments/sepolia/SplitJoin32Verifier.json @@ -0,0 +1,148 @@ +{ + "address": "0xee68a6ff16Ed0Fdf512b715CfF0aB7ce3D8484Ff", + "abi": [ + { + "inputs": [], + "name": "INVALID_VERIFICATION_KEY", + "type": "error" + }, + { + "inputs": [], + "name": "MOD_EXP_FAILURE", + "type": "error" + }, + { + "inputs": [], + "name": "OPENING_COMMITMENT_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "PAIRING_PREAMBLE_FAILED", + "type": "error" + }, + { + "inputs": [], + "name": "POINT_NOT_ON_CURVE", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PUBLIC_INPUT_COUNT_INVALID", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_GE_P", + "type": "error" + }, + { + "inputs": [], + "name": "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + "type": "error" + }, + { + "inputs": [], + "name": "getVerificationKeyHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_publicInputs", + "type": "bytes32[]" + } + ], + "name": "verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x40cf2d67807a8ae20d253054e06aeb88c836ea6f0c0173fa17278d56cb2e9f11", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0xee68a6ff16Ed0Fdf512b715CfF0aB7ce3D8484Ff", + "transactionIndex": 81, + "gasUsed": "2580700", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x52582c4930f31be4b72635d77cf885e16031c75864339c08f7b8705cfe6680cc", + "transactionHash": "0x40cf2d67807a8ae20d253054e06aeb88c836ea6f0c0173fa17278d56cb2e9f11", + "logs": [], + "blockNumber": 5498373, + "cumulativeGasUsed": "10441354", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"INVALID_VERIFICATION_KEY\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MOD_EXP_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OPENING_COMMITMENT_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PAIRING_PREAMBLE_FAILED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"POINT_NOT_ON_CURVE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"PUBLIC_INPUT_COUNT_INVALID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_GE_P\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PUBLIC_INPUT_INVALID_BN128_G1_POINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getVerificationKeyHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"_publicInputs\",\"type\":\"bytes32[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verify(bytes,bytes32[])\":{\"params\":{\"_proof\":\"- The serialized proof\",\"_publicInputs\":\"- An array of the public inputs\"},\"returns\":{\"_0\":\"True if proof is valid, reverts otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"verify(bytes,bytes32[])\":{\"notice\":\"Verify a Ultra Plonk proof\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Verifier.sol\":\"SplitJoin32Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x9b37e5e872d02080a83aefa272748c024ba032158fc28d1fd4e6590ce0d1094a\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x726bcf0399ed093448564df4c12cc6b4afee67edd3065cee516ac7f139c52f57\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0xb17a2506f21b67836fce1cca19a0509dd4d9fb31e3616240dbf010e9ccb83f5b\",\"license\":\"Apache-2.0\"},\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\":{\"content\":\"// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\\n// SPDX-License-Identifier: Apache-2.0\\n// Copyright 2022 Aztec\\npragma solidity >=0.8.4;\\n\\nlibrary UltraVerificationKey {\\n function verificationKeyHash() internal pure returns(bytes32) {\\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\\n }\\n\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\\n assembly {\\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \\n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \\n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \\n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \\n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\\n }\\n }\\n}\\n\\n/**\\n * @title Ultra Plonk proof verification contract\\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\\n */\\nabstract contract BaseUltraVerifier {\\n // VERIFICATION KEY MEMORY LOCATIONS\\n uint256 internal constant N_LOC = 0x380;\\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\\n uint256 internal constant OMEGA_LOC = 0x3c0;\\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\\n uint256 internal constant Q1_X_LOC = 0x400;\\n uint256 internal constant Q1_Y_LOC = 0x420;\\n uint256 internal constant Q2_X_LOC = 0x440;\\n uint256 internal constant Q2_Y_LOC = 0x460;\\n uint256 internal constant Q3_X_LOC = 0x480;\\n uint256 internal constant Q3_Y_LOC = 0x4a0;\\n uint256 internal constant Q4_X_LOC = 0x4c0;\\n uint256 internal constant Q4_Y_LOC = 0x4e0;\\n uint256 internal constant QM_X_LOC = 0x500;\\n uint256 internal constant QM_Y_LOC = 0x520;\\n uint256 internal constant QC_X_LOC = 0x540;\\n uint256 internal constant QC_Y_LOC = 0x560;\\n uint256 internal constant QARITH_X_LOC = 0x580;\\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\\n uint256 internal constant QSORT_X_LOC = 0x5c0;\\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\\n uint256 internal constant QAUX_X_LOC = 0x640;\\n uint256 internal constant QAUX_Y_LOC = 0x660;\\n uint256 internal constant SIGMA1_X_LOC = 0x680;\\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\\n uint256 internal constant SIGMA3_X_LOC = 0x700;\\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\\n uint256 internal constant SIGMA4_X_LOC = 0x740;\\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\\n uint256 internal constant TABLE1_X_LOC = 0x780;\\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\\n uint256 internal constant TABLE3_X_LOC = 0x800;\\n uint256 internal constant TABLE3_Y_LOC = 0x820;\\n uint256 internal constant TABLE4_X_LOC = 0x840;\\n uint256 internal constant TABLE4_Y_LOC = 0x860;\\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\\n uint256 internal constant ID1_X_LOC = 0x8c0;\\n uint256 internal constant ID1_Y_LOC = 0x8e0;\\n uint256 internal constant ID2_X_LOC = 0x900;\\n uint256 internal constant ID2_Y_LOC = 0x920;\\n uint256 internal constant ID3_X_LOC = 0x940;\\n uint256 internal constant ID3_Y_LOC = 0x960;\\n uint256 internal constant ID4_X_LOC = 0x980;\\n uint256 internal constant ID4_Y_LOC = 0x9a0;\\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\\n uint256 internal constant G2X_X0_LOC = 0xa00;\\n uint256 internal constant G2X_X1_LOC = 0xa20;\\n uint256 internal constant G2X_Y0_LOC = 0xa40;\\n uint256 internal constant G2X_Y1_LOC = 0xa60;\\n\\n // ### PROOF DATA MEMORY LOCATIONS\\n uint256 internal constant W1_X_LOC = 0x1200;\\n uint256 internal constant W1_Y_LOC = 0x1220;\\n uint256 internal constant W2_X_LOC = 0x1240;\\n uint256 internal constant W2_Y_LOC = 0x1260;\\n uint256 internal constant W3_X_LOC = 0x1280;\\n uint256 internal constant W3_Y_LOC = 0x12a0;\\n uint256 internal constant W4_X_LOC = 0x12c0;\\n uint256 internal constant W4_Y_LOC = 0x12e0;\\n uint256 internal constant S_X_LOC = 0x1300;\\n uint256 internal constant S_Y_LOC = 0x1320;\\n uint256 internal constant Z_X_LOC = 0x1340;\\n uint256 internal constant Z_Y_LOC = 0x1360;\\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\\n uint256 internal constant T1_X_LOC = 0x13c0;\\n uint256 internal constant T1_Y_LOC = 0x13e0;\\n uint256 internal constant T2_X_LOC = 0x1400;\\n uint256 internal constant T2_Y_LOC = 0x1420;\\n uint256 internal constant T3_X_LOC = 0x1440;\\n uint256 internal constant T3_Y_LOC = 0x1460;\\n uint256 internal constant T4_X_LOC = 0x1480;\\n uint256 internal constant T4_Y_LOC = 0x14a0;\\n\\n uint256 internal constant W1_EVAL_LOC = 0x1600;\\n uint256 internal constant W2_EVAL_LOC = 0x1620;\\n uint256 internal constant W3_EVAL_LOC = 0x1640;\\n uint256 internal constant W4_EVAL_LOC = 0x1660;\\n uint256 internal constant S_EVAL_LOC = 0x1680;\\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\\n uint256 internal constant QM_EVAL_LOC = 0x1760;\\n uint256 internal constant QC_EVAL_LOC = 0x1780;\\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\\n\\n uint256 internal constant PI_Z_X_LOC = 0x2300;\\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\\n\\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\\n\\n // ### CHALLENGES MEMORY OFFSETS\\n\\n uint256 internal constant C_BETA_LOC = 0x2600;\\n uint256 internal constant C_GAMMA_LOC = 0x2620;\\n uint256 internal constant C_ALPHA_LOC = 0x2640;\\n uint256 internal constant C_ETA_LOC = 0x2660;\\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\\n\\n uint256 internal constant C_ZETA_LOC = 0x26c0;\\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\\n uint256 internal constant C_V0_LOC = 0x2700;\\n uint256 internal constant C_V1_LOC = 0x2720;\\n uint256 internal constant C_V2_LOC = 0x2740;\\n uint256 internal constant C_V3_LOC = 0x2760;\\n uint256 internal constant C_V4_LOC = 0x2780;\\n uint256 internal constant C_V5_LOC = 0x27a0;\\n uint256 internal constant C_V6_LOC = 0x27c0;\\n uint256 internal constant C_V7_LOC = 0x27e0;\\n uint256 internal constant C_V8_LOC = 0x2800;\\n uint256 internal constant C_V9_LOC = 0x2820;\\n uint256 internal constant C_V10_LOC = 0x2840;\\n uint256 internal constant C_V11_LOC = 0x2860;\\n uint256 internal constant C_V12_LOC = 0x2880;\\n uint256 internal constant C_V13_LOC = 0x28a0;\\n uint256 internal constant C_V14_LOC = 0x28c0;\\n uint256 internal constant C_V15_LOC = 0x28e0;\\n uint256 internal constant C_V16_LOC = 0x2900;\\n uint256 internal constant C_V17_LOC = 0x2920;\\n uint256 internal constant C_V18_LOC = 0x2940;\\n uint256 internal constant C_V19_LOC = 0x2960;\\n uint256 internal constant C_V20_LOC = 0x2980;\\n uint256 internal constant C_V21_LOC = 0x29a0;\\n uint256 internal constant C_V22_LOC = 0x29c0;\\n uint256 internal constant C_V23_LOC = 0x29e0;\\n uint256 internal constant C_V24_LOC = 0x2a00;\\n uint256 internal constant C_V25_LOC = 0x2a20;\\n uint256 internal constant C_V26_LOC = 0x2a40;\\n uint256 internal constant C_V27_LOC = 0x2a60;\\n uint256 internal constant C_V28_LOC = 0x2a80;\\n uint256 internal constant C_V29_LOC = 0x2aa0;\\n uint256 internal constant C_V30_LOC = 0x2ac0;\\n\\n uint256 internal constant C_U_LOC = 0x2b00;\\n\\n // ### LOCAL VARIABLES MEMORY OFFSETS\\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\\n uint256 internal constant L_START_LOC = 0x30a0;\\n uint256 internal constant L_END_LOC = 0x30c0;\\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\\n\\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\\n\\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\\n\\n // misc stuff\\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\\n\\n // ### RECURSION VARIABLE MEMORY LOCATIONS\\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\\n\\n // sub-identity storage\\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\\n uint256 internal constant SORT_IDENTITY = 0x3560;\\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\\n uint256 internal constant AUX_IDENTITY = 0x35a0;\\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\\n\\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\\n\\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\\n\\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\\n\\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\\n\\n // We need to hash 41 field elements when generating the NU challenge\\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\\n\\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\\n\\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\\n\\n // y^2 = x^3 + ax + b\\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\\n\\n error INVALID_VERIFICATION_KEY();\\n error POINT_NOT_ON_CURVE();\\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\\n error PUBLIC_INPUT_GE_P();\\n error MOD_EXP_FAILURE();\\n error PAIRING_PREAMBLE_FAILED();\\n error OPENING_COMMITMENT_FAILED();\\n error PAIRING_FAILED();\\n\\n function getVerificationKeyHash() public pure virtual returns (bytes32);\\n\\n /**\\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\\n */\\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\\n\\n constructor() { \\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n\\n let success := 1\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n } \\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n /**\\n * @notice Verify a Ultra Plonk proof\\n * @param _proof - The serialized proof\\n * @param _publicInputs - An array of the public inputs\\n * @return True if proof is valid, reverts otherwise\\n */\\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\\n\\n uint256 requiredPublicInputCount;\\n assembly {\\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\\n }\\n if (requiredPublicInputCount != _publicInputs.length) {\\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\\n }\\n\\n assembly {\\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\\n\\n /**\\n * LOAD PROOF FROM CALLDATA\\n */\\n {\\n let data_ptr := add(calldataload(0x04), 0x24)\\n\\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\\n\\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\\n\\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\\n\\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\\n\\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\\n\\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\\n\\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\\n\\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\\n\\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\\n\\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\\n\\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\\n\\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\\n\\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\\n\\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\\n\\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\\n\\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\\n\\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\\n\\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\\n }\\n\\n /**\\n * LOAD RECURSIVE PROOF INTO MEMORY\\n */\\n {\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\\n\\n let x0 := calldataload(index_counter)\\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\\n let y0 := calldataload(add(index_counter, 0x80))\\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\\n let x1 := calldataload(add(index_counter, 0x100))\\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\\n let y1 := calldataload(add(index_counter, 0x180))\\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\\n mstore(RECURSIVE_P1_X_LOC, x0)\\n mstore(RECURSIVE_P1_Y_LOC, y0)\\n mstore(RECURSIVE_P2_X_LOC, x1)\\n mstore(RECURSIVE_P2_Y_LOC, y1)\\n\\n // validate these are valid bn128 G1 points\\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n }\\n\\n {\\n /**\\n * Generate initial challenge\\n */\\n mstore(0x00, shl(224, mload(N_LOC)))\\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\\n let challenge := keccak256(0x00, 0x08)\\n\\n /**\\n * Generate eta challenge\\n */\\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\\n let public_inputs_start := add(calldataload(0x24), 0x24)\\n // copy the public inputs over\\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\\n\\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\\n let w_start := add(calldataload(0x04), 0x24)\\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\\n\\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\\n\\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\\n {\\n let eta := mod(challenge, p)\\n mstore(C_ETA_LOC, eta)\\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\\n }\\n\\n /**\\n * Generate beta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(W4_Y_LOC))\\n mstore(0x40, mload(W4_X_LOC))\\n mstore(0x60, mload(S_Y_LOC))\\n mstore(0x80, mload(S_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_BETA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate gamma challenge\\n */\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_GAMMA_LOC, mod(challenge, p))\\n\\n /**\\n * Generate alpha challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(Z_Y_LOC))\\n mstore(0x40, mload(Z_X_LOC))\\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\\n challenge := keccak256(0x00, 0xa0)\\n mstore(C_ALPHA_LOC, mod(challenge, p))\\n\\n /**\\n * Compute and store some powers of alpha for future computations\\n */\\n let alpha := mload(C_ALPHA_LOC)\\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\\n mstore(C_ALPHA_BASE_LOC, alpha)\\n\\n /**\\n * Generate zeta challenge\\n */\\n mstore(0x00, challenge)\\n mstore(0x20, mload(T1_Y_LOC))\\n mstore(0x40, mload(T1_X_LOC))\\n mstore(0x60, mload(T2_Y_LOC))\\n mstore(0x80, mload(T2_X_LOC))\\n mstore(0xa0, mload(T3_Y_LOC))\\n mstore(0xc0, mload(T3_X_LOC))\\n mstore(0xe0, mload(T4_Y_LOC))\\n mstore(0x100, mload(T4_X_LOC))\\n\\n challenge := keccak256(0x00, 0x120)\\n\\n mstore(C_ZETA_LOC, mod(challenge, p))\\n mstore(C_CURRENT_LOC, challenge)\\n }\\n\\n /**\\n * EVALUATE FIELD OPERATIONS\\n */\\n\\n /**\\n * COMPUTE PUBLIC INPUT DELTA\\n * \\u0394PI = \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3(i) + \\u03b3) / \\u220f\\u1d62\\u2208\\u2113(w\\u1d62 + \\u03b2 \\u03c3'(i) + \\u03b3)\\n */\\n {\\n let beta := mload(C_BETA_LOC) // \\u03b2\\n let gamma := mload(C_GAMMA_LOC) // \\u03b3\\n let work_root := mload(OMEGA_LOC) // \\u03c9\\n let numerator_value := 1\\n let denominator_value := 1\\n\\n let p_clone := p // move p to the front of the stack\\n let valid_inputs := true\\n\\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\\n\\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\\n\\n // root_1 = \\u03b2 * 0x05\\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.\\u03b2\\n // root_2 = \\u03b2 * 0x0c\\n let root_2 := mulmod(beta, 0x0c, p_clone)\\n // @note 0x05 + 0x07 == 0x0c == external coset generator\\n\\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\\n /**\\n * input = public_input[i]\\n * valid_inputs &= input < p\\n * temp = input + gamma\\n * numerator_value *= (\\u03b2.\\u03c3(i) + w\\u1d62 + \\u03b3) // \\u03c3(i) = 0x05.\\u03c9\\u2071\\n * denominator_value *= (\\u03b2.\\u03c3'(i) + w\\u1d62 + \\u03b3) // \\u03c3'(i) = 0x0c.\\u03c9\\u2071\\n * root_1 *= \\u03c9\\n * root_2 *= \\u03c9\\n */\\n\\n let input := calldataload(public_inputs_ptr)\\n valid_inputs := and(valid_inputs, lt(input, p_clone))\\n let temp := addmod(input, gamma, p_clone)\\n\\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\\n\\n root_1 := mulmod(root_1, work_root, p_clone)\\n root_2 := mulmod(root_2, work_root, p_clone)\\n }\\n\\n // Revert if not all public inputs are field elements (i.e. < p)\\n if iszero(valid_inputs) {\\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n\\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\\n }\\n\\n /**\\n * Compute Plookup delta factor [\\u03b3(1 + \\u03b2)]^{n-k}\\n * k = num roots cut out of Z_H = 4\\n */\\n {\\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let delta_numerator := delta_base\\n {\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\\n }\\n }\\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\\n\\n let delta_denominator := mulmod(delta_base, delta_base, p)\\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\\n }\\n /**\\n * Compute lagrange poly and vanishing poly fractions\\n */\\n {\\n /**\\n * vanishing_numerator = zeta\\n * ZETA_POW_N = zeta^n\\n * vanishing_numerator -= 1\\n * accumulating_root = omega_inverse\\n * work_root = p - accumulating_root\\n * domain_inverse = domain_inverse\\n * vanishing_denominator = zeta + work_root\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * work_root *= accumulating_root\\n * vanishing_denominator *= (zeta + work_root)\\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\\n * work_root = omega\\n * lagrange_numerator = vanishing_numerator * domain_inverse\\n * l_start_denominator = zeta - 1\\n * accumulating_root = work_root^2\\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\\n * Note: l_end_denominator term contains a term \\\\omega^5 to cut out 5 roots of unity from vanishing poly\\n */\\n\\n let zeta := mload(C_ZETA_LOC)\\n\\n // compute zeta^n, where n is a power of 2\\n let vanishing_numerator := zeta\\n {\\n // pow_small\\n let exponent := mload(N_LOC)\\n let count := 1\\n for {} lt(count, exponent) { count := add(count, count) } {\\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\\n }\\n }\\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\\n\\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\\n let work_root := sub(p, accumulating_root)\\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\\n\\n let vanishing_denominator := addmod(zeta, work_root, p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n work_root := mulmod(work_root, accumulating_root, p)\\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\\n vanishing_denominator :=\\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\\n\\n work_root := mload(OMEGA_LOC)\\n\\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\\n\\n accumulating_root := mulmod(work_root, work_root, p)\\n\\n let l_end_denominator :=\\n addmod(\\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\\n )\\n\\n /**\\n * Compute inversions using Montgomery's batch inversion trick\\n */\\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\\n let t0 := accumulator\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n let t1 := accumulator\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n let t2 := accumulator\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n let t3 := accumulator\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n let t4 := accumulator\\n {\\n mstore(0, 0x20)\\n mstore(0x20, 0x20)\\n mstore(0x40, 0x20)\\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\\n mstore(0x80, sub(p, 2))\\n mstore(0xa0, p)\\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n accumulator := mload(0x00)\\n }\\n\\n t4 := mulmod(accumulator, t4, p)\\n accumulator := mulmod(accumulator, l_end_denominator, p)\\n\\n t3 := mulmod(accumulator, t3, p)\\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\\n\\n t2 := mulmod(accumulator, t2, p)\\n accumulator := mulmod(accumulator, l_start_denominator, p)\\n\\n t1 := mulmod(accumulator, t1, p)\\n accumulator := mulmod(accumulator, vanishing_numerator, p)\\n\\n t0 := mulmod(accumulator, t0, p)\\n accumulator := mulmod(accumulator, vanishing_denominator, p)\\n\\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\\n\\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\\n }\\n\\n /**\\n * UltraPlonk Widget Ordering:\\n *\\n * 1. Permutation widget\\n * 2. Plookup widget\\n * 3. Arithmetic widget\\n * 4. Fixed base widget (?)\\n * 5. GenPermSort widget\\n * 6. Elliptic widget\\n * 7. Auxiliary widget\\n */\\n\\n /**\\n * COMPUTE PERMUTATION WIDGET EVALUATION\\n */\\n {\\n let alpha := mload(C_ALPHA_LOC)\\n let beta := mload(C_BETA_LOC)\\n let gamma := mload(C_GAMMA_LOC)\\n\\n /**\\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\\n * result = alpha_base * z_eval * t1 * t2\\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\\n * result -= (alpha_base * z_omega_eval * t1 * t2)\\n */\\n let t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\\n p\\n )\\n let t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\\n p\\n )\\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\\n t1 :=\\n mulmod(\\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\\n p\\n )\\n t2 :=\\n mulmod(\\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\\n p\\n )\\n result :=\\n addmod(\\n result,\\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\\n p\\n )\\n\\n /**\\n * alpha_base *= alpha\\n * result += alpha_base . (L_{n-k}(\\u0293) . (z(\\u0293.\\u03c9) - \\u2206_{PI}))\\n * alpha_base *= alpha\\n * result += alpha_base . (L_1(\\u0293)(Z(\\u0293) - 1))\\n * alpha_Base *= alpha\\n */\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n result :=\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(L_END_LOC),\\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n mstore(\\n PERMUTATION_IDENTITY,\\n addmod(\\n result,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\\n p\\n ),\\n p\\n )\\n )\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\\n }\\n\\n /**\\n * COMPUTE PLOOKUP WIDGET EVALUATION\\n */\\n {\\n /**\\n * Goal: f = (w1(z) + q2.w1(z\\u03c9)) + \\u03b7(w2(z) + qm.w2(z\\u03c9)) + \\u03b7\\u00b2(w3(z) + qc.w_3(z\\u03c9)) + q3(z).\\u03b7\\u00b3\\n * f = \\u03b7.q3(z)\\n * f += (w3(z) + qc.w_3(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w2(z) + qm.w2(z\\u03c9))\\n * f *= \\u03b7\\n * f += (w1(z) + q2.w1(z\\u03c9))\\n */\\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\\n f := mulmod(f, mload(C_ETA_LOC), p)\\n f :=\\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\\n\\n // t(z) = table4(z).\\u03b7\\u00b3 + table3(z).\\u03b7\\u00b2 + table2(z).\\u03b7 + table1(z)\\n let t :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_EVAL_LOC),\\n p\\n )\\n\\n // t(zw) = table4(zw).\\u03b7\\u00b3 + table3(zw).\\u03b7\\u00b2 + table2(zw).\\u03b7 + table1(zw)\\n let t_omega :=\\n addmod(\\n addmod(\\n addmod(\\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\\n p\\n ),\\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\\n p\\n ),\\n mload(TABLE1_OMEGA_EVAL_LOC),\\n p\\n )\\n\\n /**\\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + \\u03b3) * (t(z) + \\u03b2t(z\\u03c9) + \\u03b3(\\u03b2 + 1)) * (\\u03b2 + 1)\\n * gamma_beta_constant = \\u03b3(\\u03b2 + 1)\\n * numerator = f * TABLE_TYPE_EVAL + gamma\\n * temp0 = t(z) + t(z\\u03c9) * \\u03b2 + gamma_beta_constant\\n * numerator *= temp0\\n * numerator *= (\\u03b2 + 1)\\n * temp0 = alpha * l_1\\n * numerator += temp0\\n * numerator *= z_lookup(z)\\n * numerator -= temp0\\n */\\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\\n numerator := mulmod(numerator, temp0, p)\\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\\n numerator := addmod(numerator, temp0, p)\\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\\n numerator := addmod(numerator, sub(p, temp0), p)\\n\\n /**\\n * Goal: denominator = z_lookup(z\\u03c9)*[s(z) + \\u03b2s(z\\u03c9) + \\u03b3(1 + \\u03b2)] - [z_lookup(z\\u03c9) - [\\u03b3(1 + \\u03b2)]^{n-k}]*\\u03b1\\u00b2L_end(z)\\n * note: delta_factor = [\\u03b3(1 + \\u03b2)]^{n-k}\\n * denominator = s(z) + \\u03b2s(z\\u03c9) + \\u03b3(\\u03b2 + 1)\\n * temp1 = \\u03b1\\u00b2L_end(z)\\n * denominator -= temp1\\n * denominator *= z_lookup(z\\u03c9)\\n * denominator += temp1 * delta_factor\\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\\n * alpha_base *= alpha^3\\n */\\n let denominator :=\\n addmod(\\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\\n gamma_beta_constant,\\n p\\n )\\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\\n denominator := addmod(denominator, sub(p, temp1), p)\\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\\n\\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ARITHMETIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * The basic arithmetic gate identity in standard plonk is as follows.\\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\\n * However, for Ultraplonk, we extend this to support \\\"passing\\\" wires between rows (shown without alpha scaling below):\\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\\n * (q_arith - 1)*( \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\\n *\\n * This formula results in several cases depending on q_arith:\\n * 1. q_arith == 0: Arithmetic gate is completely disabled\\n *\\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\\n *\\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\\n *\\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. \\u03b1 allows us to split\\n * the equation into two:\\n *\\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\\n *\\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\\n * The equation can be split into two:\\n *\\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\\n * and\\n * w_1 + w_4 - w_1_omega + q_m = 0\\n *\\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\\n * product.\\n */\\n\\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\\n\\n // @todo - Add a explicit test that hits QARITH == 3\\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\\n let w1w2qm :=\\n mulmod(\\n mulmod(\\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\\n p\\n ),\\n NEGATIVE_INVERSE_OF_2_MODULO_P,\\n p\\n )\\n\\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\\n let identity :=\\n addmod(\\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\\n )\\n\\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\\n // w_1 + w_4 - w_1_omega + q_m = 0\\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\\n // \\u03b1 * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\\n let extra_small_addition_gate_identity :=\\n mulmod(\\n mload(C_ALPHA_LOC),\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\\n addmod(\\n mload(QM_EVAL_LOC),\\n addmod(\\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n\\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\\n mstore(\\n ARITHMETIC_IDENTITY,\\n mulmod(\\n mload(C_ALPHA_BASE_LOC),\\n mulmod(\\n mload(QARITH_EVAL_LOC),\\n addmod(\\n identity,\\n mulmod(\\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\\n p\\n ),\\n p\\n ),\\n p\\n ),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\\n }\\n\\n /**\\n * COMPUTE GENPERMSORT WIDGET EVALUATION\\n */\\n {\\n /**\\n * D1 = (w2 - w1)\\n * D2 = (w3 - w2)\\n * D3 = (w4 - w3)\\n * D4 = (w1_omega - w4)\\n *\\n * \\u03b1_a = alpha_base\\n * \\u03b1_b = alpha_base * \\u03b1\\n * \\u03b1_c = alpha_base * \\u03b1^2\\n * \\u03b1_d = alpha_base * \\u03b1^3\\n *\\n * range_accumulator = (\\n * D1(D1 - 1)(D1 - 2)(D1 - 3).\\u03b1_a +\\n * D2(D2 - 1)(D2 - 2)(D2 - 3).\\u03b1_b +\\n * D3(D3 - 1)(D3 - 2)(D3 - 3).\\u03b1_c +\\n * D4(D4 - 1)(D4 - 2)(D4 - 3).\\u03b1_d +\\n * ) . q_sort\\n */\\n let minus_two := sub(p, 2)\\n let minus_three := sub(p, 3)\\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n\\n let range_accumulator :=\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\\n addmod(d1, minus_three, p),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\\n addmod(d2, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\\n addmod(d3, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator :=\\n addmod(\\n range_accumulator,\\n mulmod(\\n mulmod(\\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\\n addmod(d4, minus_three, p),\\n p\\n ),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\\n p\\n ),\\n p\\n )\\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\\n\\n mstore(SORT_IDENTITY, range_accumulator)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE ELLIPTIC WIDGET EVALUATION\\n */\\n {\\n /**\\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\\n * endo_sqr_term = x_2^2\\n * endo_sqr_term *= (x_3 - x_1)\\n * endo_sqr_term *= q_beta^2\\n * leftovers = x_2^2\\n * leftovers *= x_2\\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\\n * leftovers -= (y_2^2 + y_1^2)\\n * sign_term = y_2 * y_1\\n * sign_term += sign_term\\n * sign_term *= q_sign\\n */\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\\n\\n let x_add_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n mulmod(x_diff, x_diff, p),\\n p\\n ),\\n addmod(\\n sub(\\n p,\\n addmod(y2_sqr, y1_sqr, p)\\n ),\\n addmod(y1y2, y1y2, p),\\n p\\n ),\\n p\\n )\\n x_add_identity :=\\n mulmod(\\n mulmod(\\n x_add_identity,\\n addmod(\\n 1,\\n sub(p, mload(QM_EVAL_LOC)),\\n p\\n ),\\n p\\n ),\\n mload(C_ALPHA_BASE_LOC),\\n p\\n )\\n\\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\\n let y1_plus_y3 := addmod(\\n mload(Y1_EVAL_LOC),\\n mload(Y3_EVAL_LOC),\\n p\\n )\\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\\n let y_add_identity :=\\n addmod(\\n mulmod(y1_plus_y3, x_diff, p),\\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\\n p\\n )\\n y_add_identity :=\\n mulmod(\\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\\n p\\n )\\n\\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\\n )\\n }\\n {\\n /**\\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\\n * x_1_pow_4_mul_9 = x_pow_4;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\\n * x_1_pow_4_mul_9 += x_pow_4;\\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\\n */\\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\\n let x_double_identity :=\\n addmod(\\n mulmod(\\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\\n y1_sqr_mul_4,\\n p\\n ),\\n sub(p, x1_pow_4_mul_9),\\n p\\n )\\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\\n let y_double_identity :=\\n addmod(\\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\\n sub(\\n p,\\n mulmod(\\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\\n p\\n )\\n ),\\n p\\n )\\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\\n y_double_identity :=\\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\\n mstore(\\n ELLIPTIC_IDENTITY,\\n addmod(\\n mload(ELLIPTIC_IDENTITY),\\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\\n p\\n )\\n )\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\\n }\\n\\n /**\\n * COMPUTE AUXILIARY WIDGET EVALUATION\\n */\\n {\\n {\\n /**\\n * Non native field arithmetic gate 2\\n * _ _\\n * / _ _ _ 14 \\\\\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\\n * \\\\_ _/\\n *\\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\\n * non_native_field_gate_2 -= w_4_omega\\n * non_native_field_gate_2 += limb_subproduct\\n * non_native_field_gate_2 *= q_4\\n * limb_subproduct *= limb_size\\n * limb_subproduct += w_1_omega * w_2_omega\\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\\n */\\n\\n let limb_subproduct :=\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\\n p\\n )\\n\\n let non_native_field_gate_2 :=\\n addmod(\\n addmod(\\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\\n p\\n )\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\\n limb_subproduct :=\\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\\n let non_native_field_gate_1 :=\\n mulmod(\\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\\n mload(Q3_EVAL_LOC),\\n p\\n )\\n let non_native_field_gate_3 :=\\n mulmod(\\n addmod(\\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\\n p\\n ),\\n mload(QM_EVAL_LOC),\\n p\\n )\\n let non_native_field_identity :=\\n mulmod(\\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\\n mload(Q2_EVAL_LOC),\\n p\\n )\\n\\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\\n }\\n\\n {\\n /**\\n * limb_accumulator_1 = w_2_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1_omega;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_3;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_2;\\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\\n * limb_accumulator_1 += w_1;\\n * limb_accumulator_1 -= w_4;\\n * limb_accumulator_1 *= q_4;\\n */\\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\\n\\n /**\\n * limb_accumulator_2 = w_3_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_2_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_1_omega;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_4;\\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\\n * limb_accumulator_2 += w_3;\\n * limb_accumulator_2 -= w_4_omega;\\n * limb_accumulator_2 *= q_m;\\n */\\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\\n\\n mstore(\\n AUX_LIMB_ACCUMULATOR_EVALUATION,\\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\\n )\\n }\\n\\n {\\n /**\\n * memory_record_check = w_3;\\n * memory_record_check *= eta;\\n * memory_record_check += w_2;\\n * memory_record_check *= eta;\\n * memory_record_check += w_1;\\n * memory_record_check *= eta;\\n * memory_record_check += q_c;\\n *\\n * partial_record_check = memory_record_check;\\n *\\n * memory_record_check -= w_4;\\n */\\n\\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\\n\\n let partial_record_check := memory_record_check\\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\\n\\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\\n\\n // index_delta = w_1_omega - w_1\\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\\n // record_delta = w_4_omega - w_4\\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\\n\\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\\n let adjacent_values_match_if_adjacent_indices_match :=\\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\\n\\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\\n mstore(\\n AUX_ROM_CONSISTENCY_EVALUATION,\\n addmod(\\n mulmod(\\n addmod(\\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\\n index_is_monotonically_increasing,\\n p\\n ),\\n mload(C_ALPHA_LOC),\\n p\\n ),\\n memory_record_check,\\n p\\n )\\n )\\n\\n {\\n /**\\n * next_gate_access_type = w_3_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_2_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type += w_1_omega;\\n * next_gate_access_type *= eta;\\n * next_gate_access_type = w_4_omega - next_gate_access_type;\\n */\\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\\n\\n // value_delta = w_3_omega - w_3\\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\\n\\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\\n mulmod(\\n addmod(1, sub(p, index_delta), p),\\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\\n p\\n )\\n\\n // AUX_RAM_CONSISTENCY_EVALUATION\\n\\n /**\\n * access_type = w_4 - partial_record_check\\n * access_check = access_type^2 - access_type\\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\\n * RAM_consistency_check_identity *= alpha;\\n * RAM_consistency_check_identity += access_check;\\n */\\n\\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\\n let next_gate_access_type_is_boolean :=\\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\\n let RAM_cci :=\\n mulmod(\\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\\n mload(C_ALPHA_LOC),\\n p\\n )\\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\\n RAM_cci := addmod(RAM_cci, access_check, p)\\n\\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\\n }\\n\\n {\\n // timestamp_delta = w_2_omega - w_2\\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\\n\\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\\n let RAM_timestamp_check_identity :=\\n addmod(\\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\\n )\\n\\n /**\\n * memory_identity = ROM_consistency_check_identity * q_2;\\n * memory_identity += RAM_timestamp_check_identity * q_4;\\n * memory_identity += memory_record_check * q_m;\\n * memory_identity *= q_1;\\n * memory_identity += (RAM_consistency_check_identity * q_arith);\\n *\\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\\n * auxiliary_identity *= q_aux;\\n * auxiliary_identity *= alpha_base;\\n */\\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\\n memory_identity :=\\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\\n memory_identity :=\\n addmod(\\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\\n )\\n\\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\\n\\n mstore(AUX_IDENTITY, auxiliary_identity)\\n\\n // update alpha\\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\\n }\\n }\\n }\\n\\n {\\n /**\\n * quotient = ARITHMETIC_IDENTITY\\n * quotient += PERMUTATION_IDENTITY\\n * quotient += PLOOKUP_IDENTITY\\n * quotient += SORT_IDENTITY\\n * quotient += ELLIPTIC_IDENTITY\\n * quotient += AUX_IDENTITY\\n * quotient *= ZERO_POLY_INVERSE\\n */\\n mstore(\\n QUOTIENT_EVAL_LOC,\\n mulmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(\\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\\n mload(ARITHMETIC_IDENTITY),\\n p\\n ),\\n mload(SORT_IDENTITY),\\n p\\n ),\\n mload(ELLIPTIC_IDENTITY),\\n p\\n ),\\n mload(AUX_IDENTITY),\\n p\\n ),\\n mload(ZERO_POLY_INVERSE_LOC),\\n p\\n )\\n )\\n }\\n\\n /**\\n * GENERATE NU AND SEPARATOR CHALLENGES\\n */\\n {\\n let current_challenge := mload(C_CURRENT_LOC)\\n // get a calldata pointer that points to the start of the data we want to copy\\n let calldata_ptr := add(calldataload(0x04), 0x24)\\n\\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\\n\\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\\n\\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\\n\\n mstore(C_V0_LOC, mod(challenge, p))\\n // We need THIRTY-ONE independent nu challenges!\\n mstore(0x00, challenge)\\n mstore8(0x20, 0x01)\\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x02)\\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x03)\\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x04)\\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x05)\\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x06)\\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x07)\\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x08)\\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x09)\\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0a)\\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0b)\\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0c)\\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0d)\\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0e)\\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x0f)\\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x10)\\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x11)\\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x12)\\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x13)\\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x14)\\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x15)\\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x16)\\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x17)\\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x18)\\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x19)\\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1a)\\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1b)\\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1c)\\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\\n mstore8(0x20, 0x1d)\\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\\n\\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\\n mstore8(0x20, 0x1d)\\n challenge := keccak256(0x00, 0x21)\\n mstore(C_V30_LOC, mod(challenge, p))\\n\\n // separator\\n mstore(0x00, challenge)\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\\n\\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\\n }\\n\\n let success := 0\\n // VALIDATE T1\\n {\\n let x := mload(T1_X_LOC)\\n let y := mload(T1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(ACCUMULATOR_X_LOC, x)\\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\\n }\\n // VALIDATE T2\\n {\\n let x := mload(T2_X_LOC) // 0x1400\\n let y := mload(T2_Y_LOC) // 0x1420\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(ZETA_POW_N_LOC))\\n // accumulator_2 = [T2].zeta^n\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = [T1] + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T3\\n {\\n let x := mload(T3_X_LOC)\\n let y := mload(T3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T3].zeta^{2n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE T4\\n {\\n let x := mload(T4_X_LOC)\\n let y := mload(T4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\\n // accumulator_2 = [T4].zeta^{3n}\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W1\\n {\\n let x := mload(W1_X_LOC)\\n let y := mload(W1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\\n // accumulator_2 = v0.(u + 1).[W1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W2\\n {\\n let x := mload(W2_X_LOC)\\n let y := mload(W2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\\n // accumulator_2 = v1.(u + 1).[W2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W3\\n {\\n let x := mload(W3_X_LOC)\\n let y := mload(W3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\\n // accumulator_2 = v2.(u + 1).[W3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE W4\\n {\\n let x := mload(W4_X_LOC)\\n let y := mload(W4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\\n // accumulator_2 = v3.(u + 1).[W4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE S\\n {\\n let x := mload(S_X_LOC)\\n let y := mload(S_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\\n // accumulator_2 = v4.(u + 1).[S]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z\\n {\\n let x := mload(Z_X_LOC)\\n let y := mload(Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\\n // accumulator_2 = v5.(u + 1).[Z]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Z_LOOKUP\\n {\\n let x := mload(Z_LOOKUP_X_LOC)\\n let y := mload(Z_LOOKUP_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q1\\n {\\n let x := mload(Q1_X_LOC)\\n let y := mload(Q1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V7_LOC))\\n // accumulator_2 = v7.[Q1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q2\\n {\\n let x := mload(Q2_X_LOC)\\n let y := mload(Q2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V8_LOC))\\n // accumulator_2 = v8.[Q2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q3\\n {\\n let x := mload(Q3_X_LOC)\\n let y := mload(Q3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V9_LOC))\\n // accumulator_2 = v9.[Q3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE Q4\\n {\\n let x := mload(Q4_X_LOC)\\n let y := mload(Q4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V10_LOC))\\n // accumulator_2 = v10.[Q4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QM\\n {\\n let x := mload(QM_X_LOC)\\n let y := mload(QM_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V11_LOC))\\n // accumulator_2 = v11.[Q;]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QC\\n {\\n let x := mload(QC_X_LOC)\\n let y := mload(QC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V12_LOC))\\n // accumulator_2 = v12.[QC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QARITH\\n {\\n let x := mload(QARITH_X_LOC)\\n let y := mload(QARITH_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V13_LOC))\\n // accumulator_2 = v13.[QARITH]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QSORT\\n {\\n let x := mload(QSORT_X_LOC)\\n let y := mload(QSORT_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V14_LOC))\\n // accumulator_2 = v14.[QSORT]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QELLIPTIC\\n {\\n let x := mload(QELLIPTIC_X_LOC)\\n let y := mload(QELLIPTIC_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V15_LOC))\\n // accumulator_2 = v15.[QELLIPTIC]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE QAUX\\n {\\n let x := mload(QAUX_X_LOC)\\n let y := mload(QAUX_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V16_LOC))\\n // accumulator_2 = v15.[Q_AUX]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA1\\n {\\n let x := mload(SIGMA1_X_LOC)\\n let y := mload(SIGMA1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V17_LOC))\\n // accumulator_2 = v17.[sigma1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA2\\n {\\n let x := mload(SIGMA2_X_LOC)\\n let y := mload(SIGMA2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V18_LOC))\\n // accumulator_2 = v18.[sigma2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA3\\n {\\n let x := mload(SIGMA3_X_LOC)\\n let y := mload(SIGMA3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V19_LOC))\\n // accumulator_2 = v19.[sigma3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE SIGMA4\\n {\\n let x := mload(SIGMA4_X_LOC)\\n let y := mload(SIGMA4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V20_LOC))\\n // accumulator_2 = v20.[sigma4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE1\\n {\\n let x := mload(TABLE1_X_LOC)\\n let y := mload(TABLE1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\\n // accumulator_2 = u.[table1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE2\\n {\\n let x := mload(TABLE2_X_LOC)\\n let y := mload(TABLE2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\\n // accumulator_2 = u.[table2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE3\\n {\\n let x := mload(TABLE3_X_LOC)\\n let y := mload(TABLE3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\\n // accumulator_2 = u.[table3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE4\\n {\\n let x := mload(TABLE4_X_LOC)\\n let y := mload(TABLE4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\\n // accumulator_2 = u.[table4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE TABLE_TYPE\\n {\\n let x := mload(TABLE_TYPE_X_LOC)\\n let y := mload(TABLE_TYPE_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V25_LOC))\\n // accumulator_2 = v25.[TableType]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID1\\n {\\n let x := mload(ID1_X_LOC)\\n let y := mload(ID1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V26_LOC))\\n // accumulator_2 = v26.[ID1]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID2\\n {\\n let x := mload(ID2_X_LOC)\\n let y := mload(ID2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V27_LOC))\\n // accumulator_2 = v27.[ID2]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID3\\n {\\n let x := mload(ID3_X_LOC)\\n let y := mload(ID3_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V28_LOC))\\n // accumulator_2 = v28.[ID3]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE ID4\\n {\\n let x := mload(ID4_X_LOC)\\n let y := mload(ID4_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // Verification key fields verified to be on curve at contract deployment\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mload(C_V29_LOC))\\n // accumulator_2 = v29.[ID4]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n /**\\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\\n */\\n {\\n /**\\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\\n */\\n let batch_evaluation :=\\n mulmod(\\n mload(C_V0_LOC),\\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V1_LOC),\\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V2_LOC),\\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V3_LOC),\\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V4_LOC),\\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V5_LOC),\\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V6_LOC),\\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n\\n /**\\n * batch_evaluation += v7 * Q1_EVAL\\n * batch_evaluation += v8 * Q2_EVAL\\n * batch_evaluation += v9 * Q3_EVAL\\n * batch_evaluation += v10 * Q4_EVAL\\n * batch_evaluation += v11 * QM_EVAL\\n * batch_evaluation += v12 * QC_EVAL\\n * batch_evaluation += v13 * QARITH_EVAL\\n * batch_evaluation += v14 * QSORT_EVAL_LOC\\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\\n * batch_evaluation += v16 * QAUX_EVAL_LOC\\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\\n */\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\\n\\n /**\\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\\n * batch_evaluation += v25 * table_type_eval\\n * batch_evaluation += v26 * id1_eval\\n * batch_evaluation += v27 * id2_eval\\n * batch_evaluation += v28 * id3_eval\\n * batch_evaluation += v29 * id4_eval\\n * batch_evaluation += quotient_eval\\n */\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V21_LOC),\\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V22_LOC),\\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V23_LOC),\\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation :=\\n addmod(\\n batch_evaluation,\\n mulmod(\\n mload(C_V24_LOC),\\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\\n p\\n ),\\n p\\n )\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\\n\\n mstore(0x00, 0x01) // [1].x\\n mstore(0x20, 0x02) // [1].y\\n mstore(0x40, sub(p, batch_evaluation))\\n // accumulator_2 = -[1].(batch_evaluation)\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n if iszero(success) {\\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING PREAMBLE\\n */\\n {\\n let u := mload(C_U_LOC)\\n let zeta := mload(C_ZETA_LOC)\\n // VALIDATE PI_Z\\n {\\n let x := mload(PI_Z_X_LOC)\\n let y := mload(PI_Z_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute zeta.[PI_Z] and add into accumulator\\n mstore(0x40, zeta)\\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\\n // accumulator = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\\n\\n // VALIDATE PI_Z_OMEGA\\n {\\n let x := mload(PI_Z_OMEGA_X_LOC)\\n let y := mload(PI_Z_OMEGA_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\\n // PAIRING_RHS = accumulator + accumulator_2\\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n mstore(0x00, mload(PI_Z_X_LOC))\\n mstore(0x20, mload(PI_Z_Y_LOC))\\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\\n mstore(0x80, u)\\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n // negate lhs y-coordinate\\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\\n\\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\\n // VALIDATE RECURSIVE P1\\n {\\n let x := mload(RECURSIVE_P1_X_LOC)\\n let y := mload(RECURSIVE_P1_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n\\n // compute u.u.[recursive_p1] and write into 0x60\\n mstore(0x40, mulmod(u, u, p))\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\\n // VALIDATE RECURSIVE P2\\n {\\n let x := mload(RECURSIVE_P2_X_LOC)\\n let y := mload(RECURSIVE_P2_Y_LOC)\\n let xx := mulmod(x, x, q)\\n // validate on curve\\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n mstore(0x00, x)\\n mstore(0x20, y)\\n }\\n // compute u.u.[recursive_p2] and write into 0x00\\n // 0x40 still contains u*u\\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\\n\\n // compute u.u.[recursiveP1] + rhs and write into rhs\\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\\n\\n // compute u.u.[recursiveP2] + lhs and write into lhs\\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\\n }\\n\\n if iszero(success) {\\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n /**\\n * PERFORM PAIRING\\n */\\n {\\n // rhs paired with [1]_2\\n // lhs paired with [x]_2\\n\\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\\n\\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\\n mstore(0x100, mload(G2X_X0_LOC))\\n mstore(0x120, mload(G2X_X1_LOC))\\n mstore(0x140, mload(G2X_Y0_LOC))\\n mstore(0x160, mload(G2X_Y1_LOC))\\n\\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\\n if iszero(and(success, mload(0x00))) {\\n mstore(0x0, PAIRING_FAILED_SELECTOR)\\n revert(0x00, 0x04)\\n }\\n }\\n\\n {\\n mstore(0x00, 0x01)\\n return(0x00, 0x20) // Proof succeeded!\\n }\\n }\\n }\\n}\\n\\ncontract UltraVerifier is BaseUltraVerifier {\\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\\n return UltraVerificationKey.verificationKeyHash();\\n }\\n\\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\\n }\\n}\\n\",\"keccak256\":\"0x16a59c58c28913d11ee65a3556fc22e8d420ce765c43d2a5c86129a47239d4eb\",\"license\":\"Apache-2.0\"},\"contracts/Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {UltraVerifier as SplitJoin16Verifier_} from \\\"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\\\";\\nimport {UltraVerifier as SplitJoin32Verifier_} from \\\"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\\\";\\nimport {UltraVerifier as Hash2Verifier_} from \\\"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\\\";\\nimport {UltraVerifier as NoteVerifier_} from \\\"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\\\";\\n\\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\\n\\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\\n\\ncontract Hash2Verifier is Hash2Verifier_ {}\\n\\ncontract NoteVerifier is NoteVerifier_ {}\\n\",\"keccak256\":\"0x773b2a82fa72bd3873170d7c921a455b6fd60b768d24c88c5e9a605b32eea73f\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af257637e5769bf60e01b60005260046000fd5b5050612ce980610b036000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c207404556581526020015b60405180910390f35b61008161007c366004612bee565b610091565b6040519015158152602001610065565b620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300526103a05182811461089e576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d19576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d13577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ed957823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9a565b50505080610f0b577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f47578483840992508001610f32565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7e578483840992508001610f69565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611074577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce5576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d1f576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d80576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de1576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e45576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611ead576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f15576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7d576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe5576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204d576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b5576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ad577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e3576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612941576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa257613400516134205185828309866003888386090887838409146129fe576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4c576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad2577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be0577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0457600080fd5b843567ffffffffffffffff80821115612c1c57600080fd5b818701915087601f830112612c3057600080fd5b813581811115612c3f57600080fd5b886020828501011115612c5157600080fd5b602092830196509450908601359080821115612c6c57600080fd5b818701915087601f830112612c8057600080fd5b813581811115612c8f57600080fd5b8860208260051b8501011115612ca457600080fd5b9598949750506020019450505056fea264697066735822122034599d6501f9934bf132bf2b4def287def85792f7d861c5909edc7f3e19449cb64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c207404556581526020015b60405180910390f35b61008161007c366004612bee565b610091565b6040519015158152602001610065565b620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300526103a05182811461089e576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d19576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d13577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ed957823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9a565b50505080610f0b577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f47578483840992508001610f32565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7e578483840992508001610f69565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611074577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce5576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d1f576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d80576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de1576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e45576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611ead576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f15576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7d576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe5576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204d576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b5576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ad577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e3576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612941576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa257613400516134205185828309866003888386090887838409146129fe576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4c576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad2577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be0577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0457600080fd5b843567ffffffffffffffff80821115612c1c57600080fd5b818701915087601f830112612c3057600080fd5b813581811115612c3f57600080fd5b886020828501011115612c5157600080fd5b602092830196509450908601359080821115612c6c57600080fd5b818701915087601f830112612c8057600080fd5b813581811115612c8f57600080fd5b8860208260051b8501011115612ca457600080fd5b9598949750506020019450505056fea264697066735822122034599d6501f9934bf132bf2b4def287def85792f7d861c5909edc7f3e19449cb64736f6c63430008180033", + "devdoc": { + "kind": "dev", + "methods": { + "verify(bytes,bytes32[])": { + "params": { + "_proof": "- The serialized proof", + "_publicInputs": "- An array of the public inputs" + }, + "returns": { + "_0": "True if proof is valid, reverts otherwise" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "verify(bytes,bytes32[])": { + "notice": "Verify a Ultra Plonk proof" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/USDC.json b/src/contracts/deployments/sepolia/USDC.json new file mode 100644 index 0000000..93f59e1 --- /dev/null +++ b/src/contracts/deployments/sepolia/USDC.json @@ -0,0 +1,530 @@ +{ + "address": "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x8aeb5b8396e6f4872994800b785912160b6bffc62ba384a449094d7475429932", + "receipt": { + "to": null, + "from": "0x87CCb20c6C213035E5aa15eFd173d39CA46d95a4", + "contractAddress": "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8", + "transactionIndex": 52, + "gasUsed": "665778", + "logsBloom": "0x00000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000002000000001000000000010000000000000000000000000000000020000000000000000000000000400000000000000000000000000000000000000000", + "blockHash": "0x8613b4c0f446af4a29de829ec39f1863f2d0decdd06c6453398a1c35e44bed82", + "transactionHash": "0x8aeb5b8396e6f4872994800b785912160b6bffc62ba384a449094d7475429932", + "logs": [ + { + "transactionIndex": 52, + "blockNumber": 5498371, + "transactionHash": "0x8aeb5b8396e6f4872994800b785912160b6bffc62ba384a449094d7475429932", + "address": "0xb7561b08648B658171dD2a8E2b4f1Ee99E9D49c8", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000087ccb20c6c213035e5aa15efd173d39ca46d95a4" + ], + "data": "0x00000000000000000000000000000000000000000000000000038d7ea4c68000", + "logIndex": 108, + "blockHash": "0x8613b4c0f446af4a29de829ec39f1863f2d0decdd06c6453398a1c35e44bed82" + } + ], + "blockNumber": 5498371, + "cumulativeGasUsed": "5068189", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "823b9fd0ce32197968842b1b9c0002f2", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/USDC.sol\":\"USDC\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC20Metadata} from \\\"./extensions/IERC20Metadata.sol\\\";\\nimport {Context} from \\\"../../utils/Context.sol\\\";\\nimport {IERC20Errors} from \\\"../../interfaces/draft-IERC6093.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * The default value of {decimals} is 18. To change this, you should override\\n * this function so it returns a different value.\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n */\\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\\n mapping(address account => uint256) private _balances;\\n\\n mapping(address account => mapping(address spender => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the default value returned by this function, unless\\n * it's overridden.\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `value`.\\n */\\n function transfer(address to, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, value);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, value);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `value`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `value`.\\n */\\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, value);\\n _transfer(from, to, value);\\n return true;\\n }\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * NOTE: This function is not virtual, {_update} should be overridden instead.\\n */\\n function _transfer(address from, address to, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n if (to == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(from, to, value);\\n }\\n\\n /**\\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\\n * this function.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _update(address from, address to, uint256 value) internal virtual {\\n if (from == address(0)) {\\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\\n _totalSupply += value;\\n } else {\\n uint256 fromBalance = _balances[from];\\n if (fromBalance < value) {\\n revert ERC20InsufficientBalance(from, fromBalance, value);\\n }\\n unchecked {\\n // Overflow not possible: value <= fromBalance <= totalSupply.\\n _balances[from] = fromBalance - value;\\n }\\n }\\n\\n if (to == address(0)) {\\n unchecked {\\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\\n _totalSupply -= value;\\n }\\n } else {\\n unchecked {\\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\\n _balances[to] += value;\\n }\\n }\\n\\n emit Transfer(from, to, value);\\n }\\n\\n /**\\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\\n * Relies on the `_update` mechanism\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * NOTE: This function is not virtual, {_update} should be overridden instead.\\n */\\n function _mint(address account, uint256 value) internal {\\n if (account == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(address(0), account, value);\\n }\\n\\n /**\\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\\n * Relies on the `_update` mechanism.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * NOTE: This function is not virtual, {_update} should be overridden instead\\n */\\n function _burn(address account, uint256 value) internal {\\n if (account == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n _update(account, address(0), value);\\n }\\n\\n /**\\n * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n *\\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\\n */\\n function _approve(address owner, address spender, uint256 value) internal {\\n _approve(owner, spender, value, true);\\n }\\n\\n /**\\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\\n *\\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\\n * `Approval` event during `transferFrom` operations.\\n *\\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\\n * true using the following override:\\n * ```\\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\\n * super._approve(owner, spender, value, true);\\n * }\\n * ```\\n *\\n * Requirements are the same as {_approve}.\\n */\\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\\n if (owner == address(0)) {\\n revert ERC20InvalidApprover(address(0));\\n }\\n if (spender == address(0)) {\\n revert ERC20InvalidSpender(address(0));\\n }\\n _allowances[owner][spender] = value;\\n if (emitEvent) {\\n emit Approval(owner, spender, value);\\n }\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `value`.\\n *\\n * Does not update the allowance value in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Does not emit an {Approval} event.\\n */\\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n if (currentAllowance < value) {\\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\\n }\\n unchecked {\\n _approve(owner, spender, currentAllowance - value, false);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/USDC.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.24;\\n\\nimport {ERC20} from \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\ncontract USDC is ERC20 {\\n constructor() ERC20(\\\"USDC\\\", \\\"USDC\\\") {\\n _mint(msg.sender, 1_000_000_000e6);\\n }\\n\\n function decimals() public view virtual override returns (uint8) {\\n return 6;\\n }\\n}\\n\",\"keccak256\":\"0x81c8f6239539342ac8f8e29f41aff8b6d027f233095f9880c8657e890fc5fdc5\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040805180820182526004808252635553444360e01b60208084018290528451808601909552918452908301529060036200004e83826200029b565b5060046200005d82826200029b565b505050620000793366038d7ea4c680006200007f60201b60201c565b6200038f565b6001600160a01b038216620000af5760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000bd60008383620000c1565b5050565b6001600160a01b038316620000f0578060026000828254620000e4919062000367565b90915550620001649050565b6001600160a01b03831660009081526020819052604090205481811015620001455760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000a6565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166200018257600280548290039055620001a1565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620001e791815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021f57607f821691505b6020821081036200024057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000296576000816000526020600020601f850160051c81016020861015620002715750805b601f850160051c820191505b8181101562000292578281556001016200027d565b5050505b505050565b81516001600160401b03811115620002b757620002b7620001f4565b620002cf81620002c884546200020a565b8462000246565b602080601f831160018114620003075760008415620002ee5750858301515b600019600386901b1c1916600185901b17855562000292565b600085815260208120601f198616915b82811015620003385788860151825594840194600190910190840162000317565b5085821015620003575787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200038957634e487b7160e01b600052601160045260246000fd5b92915050565b610939806200039f6000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063313ce5671161007657806395d89b411161005b57806395d89b4114610153578063a9059cbb1461015b578063dd62ed3e1461016e57600080fd5b8063313ce5671461010e57806370a082311461011d57600080fd5b806306fdde03146100a8578063095ea7b3146100c657806318160ddd146100e957806323b872dd146100fb575b600080fd5b6100b06101b4565b6040516100bd9190610725565b60405180910390f35b6100d96100d43660046107bb565b610246565b60405190151581526020016100bd565b6002545b6040519081526020016100bd565b6100d96101093660046107e5565b610260565b604051600681526020016100bd565b6100ed61012b366004610821565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100b0610284565b6100d96101693660046107bb565b610293565b6100ed61017c366004610843565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101c390610876565b80601f01602080910402602001604051908101604052809291908181526020018280546101ef90610876565b801561023c5780601f106102115761010080835404028352916020019161023c565b820191906000526020600020905b81548152906001019060200180831161021f57829003601f168201915b5050505050905090565b6000336102548185856102a1565b60019150505b92915050565b60003361026e8582856102b3565b610279858585610387565b506001949350505050565b6060600480546101c390610876565b600033610254818585610387565b6102ae8383836001610432565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103815781811015610372576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b61038184848484036000610432565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166103d7576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff8216610427576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b6102ae83838361057a565b73ffffffffffffffffffffffffffffffffffffffff8416610482576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff83166104d2576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015610381578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056c91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166105b25780600260008282546105a791906108c9565b909155506106649050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610638576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610369565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661068d576002805482900390556106b9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071891815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b8181101561075357858101830151858201604001528201610737565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b919050565b600080604083850312156107ce57600080fd5b6107d783610792565b946020939093013593505050565b6000806000606084860312156107fa57600080fd5b61080384610792565b925061081160208501610792565b9150604084013590509250925092565b60006020828403121561083357600080fd5b61083c82610792565b9392505050565b6000806040838503121561085657600080fd5b61085f83610792565b915061086d60208401610792565b90509250929050565b600181811c9082168061088a57607f821691505b6020821081036108c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561025a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220ce818a16e5ef8eb5cef5c8c5740e70f324205a3969fb9d7a5b19bd4a74af278464736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063313ce5671161007657806395d89b411161005b57806395d89b4114610153578063a9059cbb1461015b578063dd62ed3e1461016e57600080fd5b8063313ce5671461010e57806370a082311461011d57600080fd5b806306fdde03146100a8578063095ea7b3146100c657806318160ddd146100e957806323b872dd146100fb575b600080fd5b6100b06101b4565b6040516100bd9190610725565b60405180910390f35b6100d96100d43660046107bb565b610246565b60405190151581526020016100bd565b6002545b6040519081526020016100bd565b6100d96101093660046107e5565b610260565b604051600681526020016100bd565b6100ed61012b366004610821565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100b0610284565b6100d96101693660046107bb565b610293565b6100ed61017c366004610843565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101c390610876565b80601f01602080910402602001604051908101604052809291908181526020018280546101ef90610876565b801561023c5780601f106102115761010080835404028352916020019161023c565b820191906000526020600020905b81548152906001019060200180831161021f57829003601f168201915b5050505050905090565b6000336102548185856102a1565b60019150505b92915050565b60003361026e8582856102b3565b610279858585610387565b506001949350505050565b6060600480546101c390610876565b600033610254818585610387565b6102ae8383836001610432565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103815781811015610372576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b61038184848484036000610432565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166103d7576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff8216610427576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b6102ae83838361057a565b73ffffffffffffffffffffffffffffffffffffffff8416610482576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff83166104d2576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015610381578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056c91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166105b25780600260008282546105a791906108c9565b909155506106649050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610638576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610369565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661068d576002805482900390556106b9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071891815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b8181101561075357858101830151858201604001528201610737565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b919050565b600080604083850312156107ce57600080fd5b6107d783610792565b946020939093013593505050565b6000806000606084860312156107fa57600080fd5b61080384610792565b925061081160208501610792565b9150604084013590509250925092565b60006020828403121561083357600080fd5b61083c82610792565b9392505050565b6000806040838503121561085657600080fd5b61085f83610792565b915061086d60208401610792565b90509250929050565b600181811c9082168061088a57607f821691505b6020821081036108c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561025a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220ce818a16e5ef8eb5cef5c8c5740e70f324205a3969fb9d7a5b19bd4a74af278464736f6c63430008180033", + "devdoc": { + "errors": { + "ERC20InsufficientAllowance(address,uint256,uint256)": [ + { + "details": "Indicates a failure with the `spender`’s `allowance`. Used in transfers.", + "params": { + "allowance": "Amount of tokens a `spender` is allowed to operate with.", + "needed": "Minimum amount required to perform a transfer.", + "spender": "Address that may be allowed to operate on tokens without being their owner." + } + } + ], + "ERC20InsufficientBalance(address,uint256,uint256)": [ + { + "details": "Indicates an error related to the current `balance` of a `sender`. Used in transfers.", + "params": { + "balance": "Current balance for the interacting account.", + "needed": "Minimum amount required to perform a transfer.", + "sender": "Address whose tokens are being transferred." + } + } + ], + "ERC20InvalidApprover(address)": [ + { + "details": "Indicates a failure with the `approver` of a token to be approved. Used in approvals.", + "params": { + "approver": "Address initiating an approval operation." + } + } + ], + "ERC20InvalidReceiver(address)": [ + { + "details": "Indicates a failure with the token `receiver`. Used in transfers.", + "params": { + "receiver": "Address to which tokens are being transferred." + } + } + ], + "ERC20InvalidSender(address)": [ + { + "details": "Indicates a failure with the token `sender`. Used in transfers.", + "params": { + "sender": "Address whose tokens are being transferred." + } + } + ], + "ERC20InvalidSpender(address)": [ + { + "details": "Indicates a failure with the `spender` to be approved. Used in approvals.", + "params": { + "spender": "Address that may be allowed to operate on tokens without being their owner." + } + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero." + } + }, + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "name()": { + "details": "Returns the name of the token." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 159, + "contract": "contracts/USDC.sol:USDC", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 165, + "contract": "contracts/USDC.sol:USDC", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 167, + "contract": "contracts/USDC.sol:USDC", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 169, + "contract": "contracts/USDC.sol:USDC", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 171, + "contract": "contracts/USDC.sol:USDC", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/src/contracts/deployments/sepolia/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json b/src/contracts/deployments/sepolia/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json new file mode 100644 index 0000000..72df3c5 --- /dev/null +++ b/src/contracts/deployments/sepolia/solcInputs/823b9fd0ce32197968842b1b9c0002f2.json @@ -0,0 +1,93 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n * ```\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Create2.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Create2.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Not enough balance for performing a CREATE2 deploy.\n */\n error Create2InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev There's no code to deploy.\n */\n error Create2EmptyBytecode();\n\n /**\n * @dev The deployment failed.\n */\n error Create2FailedDeployment();\n\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\n if (address(this).balance < amount) {\n revert Create2InsufficientBalance(address(this).balance, amount);\n }\n if (bytecode.length == 0) {\n revert Create2EmptyBytecode();\n }\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n if (addr == address(0)) {\n revert Create2FailedDeployment();\n }\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" + }, + "@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol": { + "content": "// Verification Key Hash: 0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0x0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000001) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad4910) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f5228) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x00f079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de3) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "@ultralane/circuits/bin/note/contract/note/plonk_vk.sol": { + "content": "// Verification Key Hash: c2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0xc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f2962590;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000000400) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000002) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e5912) // vk.work_root\n mstore(add(_vk, 0x60), 0x3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf9) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a9) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a73) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d5) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x00e62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc1466) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d0964331) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a6) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac8) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c67) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab85415) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded8) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol": { + "content": "// Verification Key Hash: 858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0x858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed3;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000008000) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb) // vk.work_root\n mstore(add(_vk, 0x60), 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe1) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd9) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df5) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c626964025) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f543) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b552) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c06) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c1) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad7) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x22f13d8c739985db5b795429154f560091c3304e2cdf4403690a455570176925) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol": { + "content": "// Verification Key Hash: 07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565\n// SPDX-License-Identifier: Apache-2.0\n// Copyright 2022 Aztec\npragma solidity >=0.8.4;\n\nlibrary UltraVerificationKey {\n function verificationKeyHash() internal pure returns(bytes32) {\n return 0x07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c2074045565;\n }\n\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {\n assembly {\n mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000010000) // vk.circuit_size\n mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs\n mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root\n mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse\n mstore(add(_vk, 0x80), 0x0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4) // vk.Q1.x\n mstore(add(_vk, 0xa0), 0x112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f) // vk.Q1.y\n mstore(add(_vk, 0xc0), 0x1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56) // vk.Q2.x\n mstore(add(_vk, 0xe0), 0x0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a) // vk.Q2.y\n mstore(add(_vk, 0x100), 0x091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a) // vk.Q3.x\n mstore(add(_vk, 0x120), 0x158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda) // vk.Q3.y\n mstore(add(_vk, 0x140), 0x187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b43) // vk.Q4.x\n mstore(add(_vk, 0x160), 0x0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b) // vk.Q4.y\n mstore(add(_vk, 0x180), 0x189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd) // vk.Q_M.x\n mstore(add(_vk, 0x1a0), 0x0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2) // vk.Q_M.y\n mstore(add(_vk, 0x1c0), 0x00a1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e) // vk.Q_C.x\n mstore(add(_vk, 0x1e0), 0x1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4) // vk.Q_C.y\n mstore(add(_vk, 0x200), 0x035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279) // vk.Q_ARITHMETIC.x\n mstore(add(_vk, 0x220), 0x00796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c) // vk.Q_ARITHMETIC.y\n mstore(add(_vk, 0x240), 0x267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e7) // vk.QSORT.x\n mstore(add(_vk, 0x260), 0x0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b) // vk.QSORT.y\n mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x\n mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y\n mstore(add(_vk, 0x2c0), 0x2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a) // vk.Q_AUX.x\n mstore(add(_vk, 0x2e0), 0x067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df) // vk.Q_AUX.y\n mstore(add(_vk, 0x300), 0x1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4) // vk.SIGMA1.x\n mstore(add(_vk, 0x320), 0x22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f) // vk.SIGMA1.y\n mstore(add(_vk, 0x340), 0x2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee89) // vk.SIGMA2.x\n mstore(add(_vk, 0x360), 0x2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a) // vk.SIGMA2.y\n mstore(add(_vk, 0x380), 0x1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718) // vk.SIGMA3.x\n mstore(add(_vk, 0x3a0), 0x1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473) // vk.SIGMA3.y\n mstore(add(_vk, 0x3c0), 0x1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a) // vk.SIGMA4.x\n mstore(add(_vk, 0x3e0), 0x205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23) // vk.SIGMA4.y\n mstore(add(_vk, 0x400), 0x187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87) // vk.TABLE1.x\n mstore(add(_vk, 0x420), 0x01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b768) // vk.TABLE1.y\n mstore(add(_vk, 0x440), 0x2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc) // vk.TABLE2.x\n mstore(add(_vk, 0x460), 0x2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a32) // vk.TABLE2.y\n mstore(add(_vk, 0x480), 0x01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023) // vk.TABLE3.x\n mstore(add(_vk, 0x4a0), 0x0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca) // vk.TABLE3.y\n mstore(add(_vk, 0x4c0), 0x089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8) // vk.TABLE4.x\n mstore(add(_vk, 0x4e0), 0x1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2) // vk.TABLE4.y\n mstore(add(_vk, 0x500), 0x2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33) // vk.TABLE_TYPE.x\n mstore(add(_vk, 0x520), 0x1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f18) // vk.TABLE_TYPE.y\n mstore(add(_vk, 0x540), 0x1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec1) // vk.ID1.x\n mstore(add(_vk, 0x560), 0x21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a) // vk.ID1.y\n mstore(add(_vk, 0x580), 0x1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0) // vk.ID2.x\n mstore(add(_vk, 0x5a0), 0x2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4) // vk.ID2.y\n mstore(add(_vk, 0x5c0), 0x1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6) // vk.ID3.x\n mstore(add(_vk, 0x5e0), 0x10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a) // vk.ID3.y\n mstore(add(_vk, 0x600), 0x0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9) // vk.ID4.x\n mstore(add(_vk, 0x620), 0x0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa6) // vk.ID4.y\n mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof\n mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices\n mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 \n mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 \n mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 \n mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 \n mstore(_omegaInverseLoc, 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4) // vk.work_root_inverse\n }\n }\n}\n\n/**\n * @title Ultra Plonk proof verification contract\n * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified\n */\nabstract contract BaseUltraVerifier {\n // VERIFICATION KEY MEMORY LOCATIONS\n uint256 internal constant N_LOC = 0x380;\n uint256 internal constant NUM_INPUTS_LOC = 0x3a0;\n uint256 internal constant OMEGA_LOC = 0x3c0;\n uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;\n uint256 internal constant Q1_X_LOC = 0x400;\n uint256 internal constant Q1_Y_LOC = 0x420;\n uint256 internal constant Q2_X_LOC = 0x440;\n uint256 internal constant Q2_Y_LOC = 0x460;\n uint256 internal constant Q3_X_LOC = 0x480;\n uint256 internal constant Q3_Y_LOC = 0x4a0;\n uint256 internal constant Q4_X_LOC = 0x4c0;\n uint256 internal constant Q4_Y_LOC = 0x4e0;\n uint256 internal constant QM_X_LOC = 0x500;\n uint256 internal constant QM_Y_LOC = 0x520;\n uint256 internal constant QC_X_LOC = 0x540;\n uint256 internal constant QC_Y_LOC = 0x560;\n uint256 internal constant QARITH_X_LOC = 0x580;\n uint256 internal constant QARITH_Y_LOC = 0x5a0;\n uint256 internal constant QSORT_X_LOC = 0x5c0;\n uint256 internal constant QSORT_Y_LOC = 0x5e0;\n uint256 internal constant QELLIPTIC_X_LOC = 0x600;\n uint256 internal constant QELLIPTIC_Y_LOC = 0x620;\n uint256 internal constant QAUX_X_LOC = 0x640;\n uint256 internal constant QAUX_Y_LOC = 0x660;\n uint256 internal constant SIGMA1_X_LOC = 0x680;\n uint256 internal constant SIGMA1_Y_LOC = 0x6a0;\n uint256 internal constant SIGMA2_X_LOC = 0x6c0;\n uint256 internal constant SIGMA2_Y_LOC = 0x6e0;\n uint256 internal constant SIGMA3_X_LOC = 0x700;\n uint256 internal constant SIGMA3_Y_LOC = 0x720;\n uint256 internal constant SIGMA4_X_LOC = 0x740;\n uint256 internal constant SIGMA4_Y_LOC = 0x760;\n uint256 internal constant TABLE1_X_LOC = 0x780;\n uint256 internal constant TABLE1_Y_LOC = 0x7a0;\n uint256 internal constant TABLE2_X_LOC = 0x7c0;\n uint256 internal constant TABLE2_Y_LOC = 0x7e0;\n uint256 internal constant TABLE3_X_LOC = 0x800;\n uint256 internal constant TABLE3_Y_LOC = 0x820;\n uint256 internal constant TABLE4_X_LOC = 0x840;\n uint256 internal constant TABLE4_Y_LOC = 0x860;\n uint256 internal constant TABLE_TYPE_X_LOC = 0x880;\n uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;\n uint256 internal constant ID1_X_LOC = 0x8c0;\n uint256 internal constant ID1_Y_LOC = 0x8e0;\n uint256 internal constant ID2_X_LOC = 0x900;\n uint256 internal constant ID2_Y_LOC = 0x920;\n uint256 internal constant ID3_X_LOC = 0x940;\n uint256 internal constant ID3_Y_LOC = 0x960;\n uint256 internal constant ID4_X_LOC = 0x980;\n uint256 internal constant ID4_Y_LOC = 0x9a0;\n uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;\n uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;\n uint256 internal constant G2X_X0_LOC = 0xa00;\n uint256 internal constant G2X_X1_LOC = 0xa20;\n uint256 internal constant G2X_Y0_LOC = 0xa40;\n uint256 internal constant G2X_Y1_LOC = 0xa60;\n\n // ### PROOF DATA MEMORY LOCATIONS\n uint256 internal constant W1_X_LOC = 0x1200;\n uint256 internal constant W1_Y_LOC = 0x1220;\n uint256 internal constant W2_X_LOC = 0x1240;\n uint256 internal constant W2_Y_LOC = 0x1260;\n uint256 internal constant W3_X_LOC = 0x1280;\n uint256 internal constant W3_Y_LOC = 0x12a0;\n uint256 internal constant W4_X_LOC = 0x12c0;\n uint256 internal constant W4_Y_LOC = 0x12e0;\n uint256 internal constant S_X_LOC = 0x1300;\n uint256 internal constant S_Y_LOC = 0x1320;\n uint256 internal constant Z_X_LOC = 0x1340;\n uint256 internal constant Z_Y_LOC = 0x1360;\n uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;\n uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;\n uint256 internal constant T1_X_LOC = 0x13c0;\n uint256 internal constant T1_Y_LOC = 0x13e0;\n uint256 internal constant T2_X_LOC = 0x1400;\n uint256 internal constant T2_Y_LOC = 0x1420;\n uint256 internal constant T3_X_LOC = 0x1440;\n uint256 internal constant T3_Y_LOC = 0x1460;\n uint256 internal constant T4_X_LOC = 0x1480;\n uint256 internal constant T4_Y_LOC = 0x14a0;\n\n uint256 internal constant W1_EVAL_LOC = 0x1600;\n uint256 internal constant W2_EVAL_LOC = 0x1620;\n uint256 internal constant W3_EVAL_LOC = 0x1640;\n uint256 internal constant W4_EVAL_LOC = 0x1660;\n uint256 internal constant S_EVAL_LOC = 0x1680;\n uint256 internal constant Z_EVAL_LOC = 0x16a0;\n uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;\n uint256 internal constant Q1_EVAL_LOC = 0x16e0;\n uint256 internal constant Q2_EVAL_LOC = 0x1700;\n uint256 internal constant Q3_EVAL_LOC = 0x1720;\n uint256 internal constant Q4_EVAL_LOC = 0x1740;\n uint256 internal constant QM_EVAL_LOC = 0x1760;\n uint256 internal constant QC_EVAL_LOC = 0x1780;\n uint256 internal constant QARITH_EVAL_LOC = 0x17a0;\n uint256 internal constant QSORT_EVAL_LOC = 0x17c0;\n uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;\n uint256 internal constant QAUX_EVAL_LOC = 0x1800;\n uint256 internal constant TABLE1_EVAL_LOC = 0x1840;\n uint256 internal constant TABLE2_EVAL_LOC = 0x1860;\n uint256 internal constant TABLE3_EVAL_LOC = 0x1880;\n uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;\n uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;\n uint256 internal constant ID1_EVAL_LOC = 0x18e0;\n uint256 internal constant ID2_EVAL_LOC = 0x1900;\n uint256 internal constant ID3_EVAL_LOC = 0x1920;\n uint256 internal constant ID4_EVAL_LOC = 0x1940;\n uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;\n uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;\n uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;\n uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;\n uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;\n uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;\n uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;\n uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;\n uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;\n uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;\n uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;\n uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;\n uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;\n uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;\n uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;\n\n uint256 internal constant PI_Z_X_LOC = 0x2300;\n uint256 internal constant PI_Z_Y_LOC = 0x2320;\n uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;\n uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;\n\n // Used for elliptic widget. These are alias names for wire + shifted wire evaluations\n uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;\n uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;\n uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;\n uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;\n uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;\n uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;\n uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;\n uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;\n uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;\n\n // ### CHALLENGES MEMORY OFFSETS\n\n uint256 internal constant C_BETA_LOC = 0x2600;\n uint256 internal constant C_GAMMA_LOC = 0x2620;\n uint256 internal constant C_ALPHA_LOC = 0x2640;\n uint256 internal constant C_ETA_LOC = 0x2660;\n uint256 internal constant C_ETA_SQR_LOC = 0x2680;\n uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;\n\n uint256 internal constant C_ZETA_LOC = 0x26c0;\n uint256 internal constant C_CURRENT_LOC = 0x26e0;\n uint256 internal constant C_V0_LOC = 0x2700;\n uint256 internal constant C_V1_LOC = 0x2720;\n uint256 internal constant C_V2_LOC = 0x2740;\n uint256 internal constant C_V3_LOC = 0x2760;\n uint256 internal constant C_V4_LOC = 0x2780;\n uint256 internal constant C_V5_LOC = 0x27a0;\n uint256 internal constant C_V6_LOC = 0x27c0;\n uint256 internal constant C_V7_LOC = 0x27e0;\n uint256 internal constant C_V8_LOC = 0x2800;\n uint256 internal constant C_V9_LOC = 0x2820;\n uint256 internal constant C_V10_LOC = 0x2840;\n uint256 internal constant C_V11_LOC = 0x2860;\n uint256 internal constant C_V12_LOC = 0x2880;\n uint256 internal constant C_V13_LOC = 0x28a0;\n uint256 internal constant C_V14_LOC = 0x28c0;\n uint256 internal constant C_V15_LOC = 0x28e0;\n uint256 internal constant C_V16_LOC = 0x2900;\n uint256 internal constant C_V17_LOC = 0x2920;\n uint256 internal constant C_V18_LOC = 0x2940;\n uint256 internal constant C_V19_LOC = 0x2960;\n uint256 internal constant C_V20_LOC = 0x2980;\n uint256 internal constant C_V21_LOC = 0x29a0;\n uint256 internal constant C_V22_LOC = 0x29c0;\n uint256 internal constant C_V23_LOC = 0x29e0;\n uint256 internal constant C_V24_LOC = 0x2a00;\n uint256 internal constant C_V25_LOC = 0x2a20;\n uint256 internal constant C_V26_LOC = 0x2a40;\n uint256 internal constant C_V27_LOC = 0x2a60;\n uint256 internal constant C_V28_LOC = 0x2a80;\n uint256 internal constant C_V29_LOC = 0x2aa0;\n uint256 internal constant C_V30_LOC = 0x2ac0;\n\n uint256 internal constant C_U_LOC = 0x2b00;\n\n // ### LOCAL VARIABLES MEMORY OFFSETS\n uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;\n uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;\n uint256 internal constant ZETA_POW_N_LOC = 0x3040;\n uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;\n uint256 internal constant ZERO_POLY_LOC = 0x3080;\n uint256 internal constant L_START_LOC = 0x30a0;\n uint256 internal constant L_END_LOC = 0x30c0;\n uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;\n\n uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;\n uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;\n uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;\n\n uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;\n uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;\n uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;\n uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;\n uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;\n uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;\n uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;\n uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;\n\n // misc stuff\n uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;\n uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;\n uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;\n uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;\n uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;\n\n // ### RECURSION VARIABLE MEMORY LOCATIONS\n uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;\n uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;\n uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;\n uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;\n uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;\n\n // sub-identity storage\n uint256 internal constant PERMUTATION_IDENTITY = 0x3500;\n uint256 internal constant PLOOKUP_IDENTITY = 0x3520;\n uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;\n uint256 internal constant SORT_IDENTITY = 0x3560;\n uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;\n uint256 internal constant AUX_IDENTITY = 0x35a0;\n uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;\n uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;\n uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;\n uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;\n uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;\n\n uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;\n uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;\n\n // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;\n uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;\n\n bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;\n bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;\n bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;\n bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;\n bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;\n bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;\n bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;\n bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;\n\n uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes\n\n // We need to hash 41 field elements when generating the NU challenge\n // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)\n // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)\n // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)\n // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)\n // table1_omega, table2_omega, table3_omega, table4_omega (4)\n uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20\n\n // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over\n // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4\n uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0\n\n uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68\n uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14\n\n // y^2 = x^3 + ax + b\n // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic\n uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;\n\n error INVALID_VERIFICATION_KEY();\n error POINT_NOT_ON_CURVE();\n error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);\n error PUBLIC_INPUT_INVALID_BN128_G1_POINT();\n error PUBLIC_INPUT_GE_P();\n error MOD_EXP_FAILURE();\n error PAIRING_PREAMBLE_FAILED();\n error OPENING_COMMITMENT_FAILED();\n error PAIRING_FAILED();\n\n function getVerificationKeyHash() public pure virtual returns (bytes32);\n\n /**\n * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment\n */\n function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;\n\n constructor() { \n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n // We verify that all of the EC points in the verification key lie on the bn128 curve. \n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n\n let success := 1\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n } \n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))\n }\n\n if iszero(success) {\n mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n /**\n * @notice Verify a Ultra Plonk proof\n * @param _proof - The serialized proof\n * @param _publicInputs - An array of the public inputs\n * @return True if proof is valid, reverts otherwise\n */\n function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {\n loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);\n\n uint256 requiredPublicInputCount;\n assembly {\n requiredPublicInputCount := mload(NUM_INPUTS_LOC)\n }\n if (requiredPublicInputCount != _publicInputs.length) {\n revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);\n }\n\n assembly {\n let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order\n let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order\n\n /**\n * LOAD PROOF FROM CALLDATA\n */\n {\n let data_ptr := add(calldataload(0x04), 0x24)\n\n mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))\n mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))\n\n mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))\n mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))\n\n mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))\n mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))\n\n mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))\n mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))\n\n mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))\n mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))\n mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))\n mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))\n mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))\n mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))\n mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))\n mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))\n\n mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))\n mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))\n\n mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))\n mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))\n\n mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))\n mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))\n\n mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))\n mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))\n mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))\n mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))\n mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))\n mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))\n mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))\n mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))\n mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))\n mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))\n mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))\n mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))\n mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))\n mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))\n mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))\n mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))\n mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))\n\n mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))\n mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))\n\n mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))\n mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))\n\n mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))\n mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))\n mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))\n mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))\n mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))\n\n mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))\n mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))\n mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))\n mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))\n\n mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))\n mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))\n mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))\n mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))\n mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))\n\n mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))\n\n mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))\n mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))\n mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))\n mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))\n mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))\n\n mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))\n mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))\n\n mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))\n mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))\n }\n\n /**\n * LOAD RECURSIVE PROOF INTO MEMORY\n */\n {\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)\n\n let x0 := calldataload(index_counter)\n x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))\n x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))\n x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))\n let y0 := calldataload(add(index_counter, 0x80))\n y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))\n y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))\n y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))\n let x1 := calldataload(add(index_counter, 0x100))\n x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))\n x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))\n x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))\n let y1 := calldataload(add(index_counter, 0x180))\n y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))\n y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))\n y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))\n mstore(RECURSIVE_P1_X_LOC, x0)\n mstore(RECURSIVE_P1_Y_LOC, y0)\n mstore(RECURSIVE_P2_X_LOC, x1)\n mstore(RECURSIVE_P2_Y_LOC, y1)\n\n // validate these are valid bn128 G1 points\n if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {\n mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n }\n\n {\n /**\n * Generate initial challenge\n */\n mstore(0x00, shl(224, mload(N_LOC)))\n mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))\n let challenge := keccak256(0x00, 0x08)\n\n /**\n * Generate eta challenge\n */\n mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)\n // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs\n let public_inputs_start := add(calldataload(0x24), 0x24)\n // copy the public inputs over\n let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)\n calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)\n\n // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)\n let w_start := add(calldataload(0x04), 0x24)\n calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)\n\n // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)\n let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))\n\n challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)\n {\n let eta := mod(challenge, p)\n mstore(C_ETA_LOC, eta)\n mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))\n mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))\n }\n\n /**\n * Generate beta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(W4_Y_LOC))\n mstore(0x40, mload(W4_X_LOC))\n mstore(0x60, mload(S_Y_LOC))\n mstore(0x80, mload(S_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_BETA_LOC, mod(challenge, p))\n\n /**\n * Generate gamma challenge\n */\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n challenge := keccak256(0x00, 0x21)\n mstore(C_GAMMA_LOC, mod(challenge, p))\n\n /**\n * Generate alpha challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(Z_Y_LOC))\n mstore(0x40, mload(Z_X_LOC))\n mstore(0x60, mload(Z_LOOKUP_Y_LOC))\n mstore(0x80, mload(Z_LOOKUP_X_LOC))\n challenge := keccak256(0x00, 0xa0)\n mstore(C_ALPHA_LOC, mod(challenge, p))\n\n /**\n * Compute and store some powers of alpha for future computations\n */\n let alpha := mload(C_ALPHA_LOC)\n mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))\n mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))\n mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))\n mstore(C_ALPHA_BASE_LOC, alpha)\n\n /**\n * Generate zeta challenge\n */\n mstore(0x00, challenge)\n mstore(0x20, mload(T1_Y_LOC))\n mstore(0x40, mload(T1_X_LOC))\n mstore(0x60, mload(T2_Y_LOC))\n mstore(0x80, mload(T2_X_LOC))\n mstore(0xa0, mload(T3_Y_LOC))\n mstore(0xc0, mload(T3_X_LOC))\n mstore(0xe0, mload(T4_Y_LOC))\n mstore(0x100, mload(T4_X_LOC))\n\n challenge := keccak256(0x00, 0x120)\n\n mstore(C_ZETA_LOC, mod(challenge, p))\n mstore(C_CURRENT_LOC, challenge)\n }\n\n /**\n * EVALUATE FIELD OPERATIONS\n */\n\n /**\n * COMPUTE PUBLIC INPUT DELTA\n * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)\n */\n {\n let beta := mload(C_BETA_LOC) // β\n let gamma := mload(C_GAMMA_LOC) // γ\n let work_root := mload(OMEGA_LOC) // ω\n let numerator_value := 1\n let denominator_value := 1\n\n let p_clone := p // move p to the front of the stack\n let valid_inputs := true\n\n // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])\n let public_inputs_ptr := add(calldataload(0x24), 0x24)\n\n // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes\n let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))\n\n // root_1 = β * 0x05\n let root_1 := mulmod(beta, 0x05, p_clone) // k1.β\n // root_2 = β * 0x0c\n let root_2 := mulmod(beta, 0x0c, p_clone)\n // @note 0x05 + 0x07 == 0x0c == external coset generator\n\n for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {\n /**\n * input = public_input[i]\n * valid_inputs &= input < p\n * temp = input + gamma\n * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ\n * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ\n * root_1 *= ω\n * root_2 *= ω\n */\n\n let input := calldataload(public_inputs_ptr)\n valid_inputs := and(valid_inputs, lt(input, p_clone))\n let temp := addmod(input, gamma, p_clone)\n\n numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)\n denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)\n\n root_1 := mulmod(root_1, work_root, p_clone)\n root_2 := mulmod(root_2, work_root, p_clone)\n }\n\n // Revert if not all public inputs are field elements (i.e. < p)\n if iszero(valid_inputs) {\n mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)\n revert(0x00, 0x04)\n }\n\n mstore(DELTA_NUMERATOR_LOC, numerator_value)\n mstore(DELTA_DENOMINATOR_LOC, denominator_value)\n }\n\n /**\n * Compute Plookup delta factor [γ(1 + β)]^{n-k}\n * k = num roots cut out of Z_H = 4\n */\n {\n let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let delta_numerator := delta_base\n {\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n delta_numerator := mulmod(delta_numerator, delta_numerator, p)\n }\n }\n mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)\n\n let delta_denominator := mulmod(delta_base, delta_base, p)\n delta_denominator := mulmod(delta_denominator, delta_denominator, p)\n mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)\n }\n /**\n * Compute lagrange poly and vanishing poly fractions\n */\n {\n /**\n * vanishing_numerator = zeta\n * ZETA_POW_N = zeta^n\n * vanishing_numerator -= 1\n * accumulating_root = omega_inverse\n * work_root = p - accumulating_root\n * domain_inverse = domain_inverse\n * vanishing_denominator = zeta + work_root\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * work_root *= accumulating_root\n * vanishing_denominator *= (zeta + work_root)\n * vanishing_denominator *= (zeta + (zeta + accumulating_root))\n * work_root = omega\n * lagrange_numerator = vanishing_numerator * domain_inverse\n * l_start_denominator = zeta - 1\n * accumulating_root = work_root^2\n * l_end_denominator = accumulating_root^2 * work_root * zeta - 1\n * Note: l_end_denominator term contains a term \\omega^5 to cut out 5 roots of unity from vanishing poly\n */\n\n let zeta := mload(C_ZETA_LOC)\n\n // compute zeta^n, where n is a power of 2\n let vanishing_numerator := zeta\n {\n // pow_small\n let exponent := mload(N_LOC)\n let count := 1\n for {} lt(count, exponent) { count := add(count, count) } {\n vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)\n }\n }\n mstore(ZETA_POW_N_LOC, vanishing_numerator)\n vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)\n\n let accumulating_root := mload(OMEGA_INVERSE_LOC)\n let work_root := sub(p, accumulating_root)\n let domain_inverse := mload(DOMAIN_INVERSE_LOC)\n\n let vanishing_denominator := addmod(zeta, work_root, p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n work_root := mulmod(work_root, accumulating_root, p)\n vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)\n vanishing_denominator :=\n mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)\n\n work_root := mload(OMEGA_LOC)\n\n let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)\n let l_start_denominator := addmod(zeta, sub(p, 1), p)\n\n accumulating_root := mulmod(work_root, work_root, p)\n\n let l_end_denominator :=\n addmod(\n mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p\n )\n\n /**\n * Compute inversions using Montgomery's batch inversion trick\n */\n let accumulator := mload(DELTA_DENOMINATOR_LOC)\n let t0 := accumulator\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n let t1 := accumulator\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n let t2 := accumulator\n accumulator := mulmod(accumulator, l_start_denominator, p)\n let t3 := accumulator\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n let t4 := accumulator\n {\n mstore(0, 0x20)\n mstore(0x20, 0x20)\n mstore(0x40, 0x20)\n mstore(0x60, mulmod(accumulator, l_end_denominator, p))\n mstore(0x80, sub(p, 2))\n mstore(0xa0, p)\n if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {\n mstore(0x0, MOD_EXP_FAILURE_SELECTOR)\n revert(0x00, 0x04)\n }\n accumulator := mload(0x00)\n }\n\n t4 := mulmod(accumulator, t4, p)\n accumulator := mulmod(accumulator, l_end_denominator, p)\n\n t3 := mulmod(accumulator, t3, p)\n accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)\n\n t2 := mulmod(accumulator, t2, p)\n accumulator := mulmod(accumulator, l_start_denominator, p)\n\n t1 := mulmod(accumulator, t1, p)\n accumulator := mulmod(accumulator, vanishing_numerator, p)\n\n t0 := mulmod(accumulator, t0, p)\n accumulator := mulmod(accumulator, vanishing_denominator, p)\n\n accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)\n\n mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))\n mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))\n mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))\n mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))\n mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))\n mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))\n }\n\n /**\n * UltraPlonk Widget Ordering:\n *\n * 1. Permutation widget\n * 2. Plookup widget\n * 3. Arithmetic widget\n * 4. Fixed base widget (?)\n * 5. GenPermSort widget\n * 6. Elliptic widget\n * 7. Auxiliary widget\n */\n\n /**\n * COMPUTE PERMUTATION WIDGET EVALUATION\n */\n {\n let alpha := mload(C_ALPHA_LOC)\n let beta := mload(C_BETA_LOC)\n let gamma := mload(C_GAMMA_LOC)\n\n /**\n * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)\n * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)\n * result = alpha_base * z_eval * t1 * t2\n * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)\n * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)\n * result -= (alpha_base * z_omega_eval * t1 * t2)\n */\n let t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),\n p\n )\n let t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),\n p\n )\n let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)\n t1 :=\n mulmod(\n add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),\n add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),\n p\n )\n t2 :=\n mulmod(\n add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),\n add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),\n p\n )\n result :=\n addmod(\n result,\n sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),\n p\n )\n\n /**\n * alpha_base *= alpha\n * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))\n * alpha_base *= alpha\n * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1))\n * alpha_Base *= alpha\n */\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n result :=\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(L_END_LOC),\n addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),\n p\n ),\n p\n ),\n p\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n mstore(\n PERMUTATION_IDENTITY,\n addmod(\n result,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),\n p\n ),\n p\n )\n )\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))\n }\n\n /**\n * COMPUTE PLOOKUP WIDGET EVALUATION\n */\n {\n /**\n * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³\n * f = η.q3(z)\n * f += (w3(z) + qc.w_3(zω))\n * f *= η\n * f += (w2(z) + qm.w2(zω))\n * f *= η\n * f += (w1(z) + q2.w1(zω))\n */\n let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)\n f :=\n addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)\n f := mulmod(f, mload(C_ETA_LOC), p)\n f :=\n addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)\n\n // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)\n let t :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_EVAL_LOC),\n p\n )\n\n // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)\n let t_omega :=\n addmod(\n addmod(\n addmod(\n mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),\n mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),\n p\n ),\n mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),\n p\n ),\n mload(TABLE1_OMEGA_EVAL_LOC),\n p\n )\n\n /**\n * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)\n * gamma_beta_constant = γ(β + 1)\n * numerator = f * TABLE_TYPE_EVAL + gamma\n * temp0 = t(z) + t(zω) * β + gamma_beta_constant\n * numerator *= temp0\n * numerator *= (β + 1)\n * temp0 = alpha * l_1\n * numerator += temp0\n * numerator *= z_lookup(z)\n * numerator -= temp0\n */\n let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)\n let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)\n let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)\n numerator := mulmod(numerator, temp0, p)\n numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)\n temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)\n numerator := addmod(numerator, temp0, p)\n numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)\n numerator := addmod(numerator, sub(p, temp0), p)\n\n /**\n * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)\n * note: delta_factor = [γ(1 + β)]^{n-k}\n * denominator = s(z) + βs(zω) + γ(β + 1)\n * temp1 = α²L_end(z)\n * denominator -= temp1\n * denominator *= z_lookup(zω)\n * denominator += temp1 * delta_factor\n * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base\n * alpha_base *= alpha^3\n */\n let denominator :=\n addmod(\n addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),\n gamma_beta_constant,\n p\n )\n let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)\n denominator := addmod(denominator, sub(p, temp1), p)\n denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)\n denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)\n\n mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n\n /**\n * COMPUTE ARITHMETIC WIDGET EVALUATION\n */\n {\n /**\n * The basic arithmetic gate identity in standard plonk is as follows.\n * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0\n * However, for Ultraplonk, we extend this to support \"passing\" wires between rows (shown without alpha scaling below):\n * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +\n * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0\n *\n * This formula results in several cases depending on q_arith:\n * 1. q_arith == 0: Arithmetic gate is completely disabled\n *\n * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation\n * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0\n *\n * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:\n * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0\n * It allows defining w_4 at next index (w_4_omega) in terms of current wire values\n *\n * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split\n * the equation into two:\n *\n * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here)\n *\n * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).\n * The equation can be split into two:\n *\n * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0\n * and\n * w_1 + w_4 - w_1_omega + q_m = 0\n *\n * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at\n * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at\n * product.\n */\n\n let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)\n let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)\n let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)\n let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)\n\n // @todo - Add a explicit test that hits QARITH == 3\n // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2\n let w1w2qm :=\n mulmod(\n mulmod(\n mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),\n addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),\n p\n ),\n NEGATIVE_INVERSE_OF_2_MODULO_P,\n p\n )\n\n // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c\n let identity :=\n addmod(\n mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p\n )\n\n // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:\n // w_1 + w_4 - w_1_omega + q_m = 0\n // we use this gate to save an addition gate when adding or subtracting non-native field elements\n // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)\n let extra_small_addition_gate_identity :=\n mulmod(\n mload(C_ALPHA_LOC),\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),\n addmod(\n mload(QM_EVAL_LOC),\n addmod(\n sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p\n ),\n p\n ),\n p\n ),\n p\n )\n\n // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity\n // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!\n // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))\n mstore(\n ARITHMETIC_IDENTITY,\n mulmod(\n mload(C_ALPHA_BASE_LOC),\n mulmod(\n mload(QARITH_EVAL_LOC),\n addmod(\n identity,\n mulmod(\n addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),\n addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),\n p\n ),\n p\n ),\n p\n ),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))\n }\n\n /**\n * COMPUTE GENPERMSORT WIDGET EVALUATION\n */\n {\n /**\n * D1 = (w2 - w1)\n * D2 = (w3 - w2)\n * D3 = (w4 - w3)\n * D4 = (w1_omega - w4)\n *\n * α_a = alpha_base\n * α_b = alpha_base * α\n * α_c = alpha_base * α^2\n * α_d = alpha_base * α^3\n *\n * range_accumulator = (\n * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +\n * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +\n * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +\n * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +\n * ) . q_sort\n */\n let minus_two := sub(p, 2)\n let minus_three := sub(p, 3)\n let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n\n let range_accumulator :=\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),\n addmod(d1, minus_three, p),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),\n addmod(d2, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),\n addmod(d3, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),\n p\n ),\n p\n )\n range_accumulator :=\n addmod(\n range_accumulator,\n mulmod(\n mulmod(\n mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),\n addmod(d4, minus_three, p),\n p\n ),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),\n p\n ),\n p\n )\n range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)\n\n mstore(SORT_IDENTITY, range_accumulator)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE ELLIPTIC WIDGET EVALUATION\n */\n {\n /**\n * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta\n * endo_sqr_term = x_2^2\n * endo_sqr_term *= (x_3 - x_1)\n * endo_sqr_term *= q_beta^2\n * leftovers = x_2^2\n * leftovers *= x_2\n * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget\n * leftovers -= (y_2^2 + y_1^2)\n * sign_term = y_2 * y_1\n * sign_term += sign_term\n * sign_term *= q_sign\n */\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)\n let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)\n\n let x_add_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n mulmod(x_diff, x_diff, p),\n p\n ),\n addmod(\n sub(\n p,\n addmod(y2_sqr, y1_sqr, p)\n ),\n addmod(y1y2, y1y2, p),\n p\n ),\n p\n )\n x_add_identity :=\n mulmod(\n mulmod(\n x_add_identity,\n addmod(\n 1,\n sub(p, mload(QM_EVAL_LOC)),\n p\n ),\n p\n ),\n mload(C_ALPHA_BASE_LOC),\n p\n )\n\n // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0\n let y1_plus_y3 := addmod(\n mload(Y1_EVAL_LOC),\n mload(Y3_EVAL_LOC),\n p\n )\n let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)\n let y_add_identity :=\n addmod(\n mulmod(y1_plus_y3, x_diff, p),\n mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),\n p\n )\n y_add_identity :=\n mulmod(\n mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),\n mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),\n p\n )\n\n // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL\n mstore(\n ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)\n )\n }\n {\n /**\n * x_pow_4 = (y_1_sqr - curve_b) * x_1;\n * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;\n * y_1_sqr_mul_4 += y_1_sqr_mul_4;\n * x_1_pow_4_mul_9 = x_pow_4;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;\n * x_1_pow_4_mul_9 += x_pow_4;\n * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;\n * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;\n * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);\n */\n // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0\n let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)\n let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)\n let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)\n let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)\n let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)\n let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)\n let x_double_identity :=\n addmod(\n mulmod(\n addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),\n y1_sqr_mul_4,\n p\n ),\n sub(p, x1_pow_4_mul_9),\n p\n )\n // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0\n let y_double_identity :=\n addmod(\n mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),\n sub(\n p,\n mulmod(\n addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),\n addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),\n p\n )\n ),\n p\n )\n x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)\n y_double_identity :=\n mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)\n x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)\n y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)\n // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL\n mstore(\n ELLIPTIC_IDENTITY,\n addmod(\n mload(ELLIPTIC_IDENTITY),\n mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),\n p\n )\n )\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))\n }\n\n /**\n * COMPUTE AUXILIARY WIDGET EVALUATION\n */\n {\n {\n /**\n * Non native field arithmetic gate 2\n * _ _\n * / _ _ _ 14 \\\n * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 |\n * \\_ _/\n *\n * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2\n * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega\n * non_native_field_gate_2 = non_native_field_gate_2 * limb_size\n * non_native_field_gate_2 -= w_4_omega\n * non_native_field_gate_2 += limb_subproduct\n * non_native_field_gate_2 *= q_4\n * limb_subproduct *= limb_size\n * limb_subproduct += w_1_omega * w_2_omega\n * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3\n * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m\n * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2\n */\n\n let limb_subproduct :=\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),\n mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),\n p\n )\n\n let non_native_field_gate_2 :=\n addmod(\n addmod(\n mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),\n mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),\n p\n ),\n sub(p, mload(W3_OMEGA_EVAL_LOC)),\n p\n )\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)\n non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)\n limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)\n limb_subproduct :=\n addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)\n let non_native_field_gate_1 :=\n mulmod(\n addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),\n mload(Q3_EVAL_LOC),\n p\n )\n let non_native_field_gate_3 :=\n mulmod(\n addmod(\n addmod(limb_subproduct, mload(W4_EVAL_LOC), p),\n sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),\n p\n ),\n mload(QM_EVAL_LOC),\n p\n )\n let non_native_field_identity :=\n mulmod(\n addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),\n mload(Q2_EVAL_LOC),\n p\n )\n\n mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)\n }\n\n {\n /**\n * limb_accumulator_1 = w_2_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1_omega;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_3;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_2;\n * limb_accumulator_1 *= SUBLIMB_SHIFT;\n * limb_accumulator_1 += w_1;\n * limb_accumulator_1 -= w_4;\n * limb_accumulator_1 *= q_4;\n */\n let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)\n limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)\n limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)\n limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)\n\n /**\n * limb_accumulator_2 = w_3_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_2_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_1_omega;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_4;\n * limb_accumulator_2 *= SUBLIMB_SHIFT;\n * limb_accumulator_2 += w_3;\n * limb_accumulator_2 -= w_4_omega;\n * limb_accumulator_2 *= q_m;\n */\n let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)\n limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)\n limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)\n limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)\n\n mstore(\n AUX_LIMB_ACCUMULATOR_EVALUATION,\n mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)\n )\n }\n\n {\n /**\n * memory_record_check = w_3;\n * memory_record_check *= eta;\n * memory_record_check += w_2;\n * memory_record_check *= eta;\n * memory_record_check += w_1;\n * memory_record_check *= eta;\n * memory_record_check += q_c;\n *\n * partial_record_check = memory_record_check;\n *\n * memory_record_check -= w_4;\n */\n\n let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)\n memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)\n memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)\n\n let partial_record_check := memory_record_check\n memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)\n\n mstore(AUX_MEMORY_EVALUATION, memory_record_check)\n\n // index_delta = w_1_omega - w_1\n let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)\n // record_delta = w_4_omega - w_4\n let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)\n // index_is_monotonically_increasing = index_delta * (index_delta - 1)\n let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)\n\n // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)\n let adjacent_values_match_if_adjacent_indices_match :=\n mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)\n\n // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check\n mstore(\n AUX_ROM_CONSISTENCY_EVALUATION,\n addmod(\n mulmod(\n addmod(\n mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),\n index_is_monotonically_increasing,\n p\n ),\n mload(C_ALPHA_LOC),\n p\n ),\n memory_record_check,\n p\n )\n )\n\n {\n /**\n * next_gate_access_type = w_3_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_2_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type += w_1_omega;\n * next_gate_access_type *= eta;\n * next_gate_access_type = w_4_omega - next_gate_access_type;\n */\n let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)\n next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)\n next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)\n\n // value_delta = w_3_omega - w_3\n let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)\n // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);\n\n let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=\n mulmod(\n addmod(1, sub(p, index_delta), p),\n mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),\n p\n )\n\n // AUX_RAM_CONSISTENCY_EVALUATION\n\n /**\n * access_type = w_4 - partial_record_check\n * access_check = access_type^2 - access_type\n * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type\n * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += index_is_monotonically_increasing;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += next_gate_access_type_is_boolean;\n * RAM_consistency_check_identity *= alpha;\n * RAM_consistency_check_identity += access_check;\n */\n\n let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)\n let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)\n let next_gate_access_type_is_boolean :=\n mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)\n let RAM_cci :=\n mulmod(\n adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,\n mload(C_ALPHA_LOC),\n p\n )\n RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)\n RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)\n RAM_cci := addmod(RAM_cci, access_check, p)\n\n mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)\n }\n\n {\n // timestamp_delta = w_2_omega - w_2\n let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)\n\n // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3\n let RAM_timestamp_check_identity :=\n addmod(\n mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p\n )\n\n /**\n * memory_identity = ROM_consistency_check_identity * q_2;\n * memory_identity += RAM_timestamp_check_identity * q_4;\n * memory_identity += memory_record_check * q_m;\n * memory_identity *= q_1;\n * memory_identity += (RAM_consistency_check_identity * q_arith);\n *\n * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;\n * auxiliary_identity *= q_aux;\n * auxiliary_identity *= alpha_base;\n */\n let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)\n memory_identity :=\n addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)\n memory_identity :=\n addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)\n memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)\n memory_identity :=\n addmod(\n memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p\n )\n\n let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)\n auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)\n auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)\n\n mstore(AUX_IDENTITY, auxiliary_identity)\n\n // update alpha\n mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))\n }\n }\n }\n\n {\n /**\n * quotient = ARITHMETIC_IDENTITY\n * quotient += PERMUTATION_IDENTITY\n * quotient += PLOOKUP_IDENTITY\n * quotient += SORT_IDENTITY\n * quotient += ELLIPTIC_IDENTITY\n * quotient += AUX_IDENTITY\n * quotient *= ZERO_POLY_INVERSE\n */\n mstore(\n QUOTIENT_EVAL_LOC,\n mulmod(\n addmod(\n addmod(\n addmod(\n addmod(\n addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),\n mload(ARITHMETIC_IDENTITY),\n p\n ),\n mload(SORT_IDENTITY),\n p\n ),\n mload(ELLIPTIC_IDENTITY),\n p\n ),\n mload(AUX_IDENTITY),\n p\n ),\n mload(ZERO_POLY_INVERSE_LOC),\n p\n )\n )\n }\n\n /**\n * GENERATE NU AND SEPARATOR CHALLENGES\n */\n {\n let current_challenge := mload(C_CURRENT_LOC)\n // get a calldata pointer that points to the start of the data we want to copy\n let calldata_ptr := add(calldataload(0x04), 0x24)\n\n calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)\n\n mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)\n mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))\n calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)\n\n // hash length = (0x20 + num field elements), we include the previous challenge in the hash\n let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))\n\n mstore(C_V0_LOC, mod(challenge, p))\n // We need THIRTY-ONE independent nu challenges!\n mstore(0x00, challenge)\n mstore8(0x20, 0x01)\n mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x02)\n mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x03)\n mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x04)\n mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x05)\n mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x06)\n mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x07)\n mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x08)\n mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x09)\n mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0a)\n mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0b)\n mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0c)\n mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0d)\n mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0e)\n mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x0f)\n mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x10)\n mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x11)\n mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x12)\n mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x13)\n mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x14)\n mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x15)\n mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x16)\n mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x17)\n mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x18)\n mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x19)\n mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1a)\n mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1b)\n mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1c)\n mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))\n mstore8(0x20, 0x1d)\n mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))\n\n // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?\n mstore8(0x20, 0x1d)\n challenge := keccak256(0x00, 0x21)\n mstore(C_V30_LOC, mod(challenge, p))\n\n // separator\n mstore(0x00, challenge)\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, mload(PI_Z_OMEGA_X_LOC))\n\n mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))\n }\n\n let success := 0\n // VALIDATE T1\n {\n let x := mload(T1_X_LOC)\n let y := mload(T1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(ACCUMULATOR_X_LOC, x)\n mstore(add(ACCUMULATOR_X_LOC, 0x20), y)\n }\n // VALIDATE T2\n {\n let x := mload(T2_X_LOC) // 0x1400\n let y := mload(T2_Y_LOC) // 0x1420\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(ZETA_POW_N_LOC))\n // accumulator_2 = [T2].zeta^n\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = [T1] + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T3\n {\n let x := mload(T3_X_LOC)\n let y := mload(T3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T3].zeta^{2n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE T4\n {\n let x := mload(T4_X_LOC)\n let y := mload(T4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))\n // accumulator_2 = [T4].zeta^{3n}\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W1\n {\n let x := mload(W1_X_LOC)\n let y := mload(W1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))\n // accumulator_2 = v0.(u + 1).[W1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W2\n {\n let x := mload(W2_X_LOC)\n let y := mload(W2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))\n // accumulator_2 = v1.(u + 1).[W2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W3\n {\n let x := mload(W3_X_LOC)\n let y := mload(W3_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))\n // accumulator_2 = v2.(u + 1).[W3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE W4\n {\n let x := mload(W4_X_LOC)\n let y := mload(W4_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))\n // accumulator_2 = v3.(u + 1).[W4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE S\n {\n let x := mload(S_X_LOC)\n let y := mload(S_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))\n // accumulator_2 = v4.(u + 1).[S]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z\n {\n let x := mload(Z_X_LOC)\n let y := mload(Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))\n // accumulator_2 = v5.(u + 1).[Z]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Z_LOOKUP\n {\n let x := mload(Z_LOOKUP_X_LOC)\n let y := mload(Z_LOOKUP_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))\n // accumulator_2 = v6.(u + 1).[Z_LOOKUP]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q1\n {\n let x := mload(Q1_X_LOC)\n let y := mload(Q1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V7_LOC))\n // accumulator_2 = v7.[Q1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q2\n {\n let x := mload(Q2_X_LOC)\n let y := mload(Q2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V8_LOC))\n // accumulator_2 = v8.[Q2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q3\n {\n let x := mload(Q3_X_LOC)\n let y := mload(Q3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V9_LOC))\n // accumulator_2 = v9.[Q3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE Q4\n {\n let x := mload(Q4_X_LOC)\n let y := mload(Q4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V10_LOC))\n // accumulator_2 = v10.[Q4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QM\n {\n let x := mload(QM_X_LOC)\n let y := mload(QM_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V11_LOC))\n // accumulator_2 = v11.[Q;]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QC\n {\n let x := mload(QC_X_LOC)\n let y := mload(QC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V12_LOC))\n // accumulator_2 = v12.[QC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QARITH\n {\n let x := mload(QARITH_X_LOC)\n let y := mload(QARITH_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V13_LOC))\n // accumulator_2 = v13.[QARITH]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QSORT\n {\n let x := mload(QSORT_X_LOC)\n let y := mload(QSORT_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V14_LOC))\n // accumulator_2 = v14.[QSORT]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QELLIPTIC\n {\n let x := mload(QELLIPTIC_X_LOC)\n let y := mload(QELLIPTIC_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V15_LOC))\n // accumulator_2 = v15.[QELLIPTIC]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE QAUX\n {\n let x := mload(QAUX_X_LOC)\n let y := mload(QAUX_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V16_LOC))\n // accumulator_2 = v15.[Q_AUX]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA1\n {\n let x := mload(SIGMA1_X_LOC)\n let y := mload(SIGMA1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V17_LOC))\n // accumulator_2 = v17.[sigma1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA2\n {\n let x := mload(SIGMA2_X_LOC)\n let y := mload(SIGMA2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V18_LOC))\n // accumulator_2 = v18.[sigma2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA3\n {\n let x := mload(SIGMA3_X_LOC)\n let y := mload(SIGMA3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V19_LOC))\n // accumulator_2 = v19.[sigma3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE SIGMA4\n {\n let x := mload(SIGMA4_X_LOC)\n let y := mload(SIGMA4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V20_LOC))\n // accumulator_2 = v20.[sigma4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE1\n {\n let x := mload(TABLE1_X_LOC)\n let y := mload(TABLE1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))\n // accumulator_2 = u.[table1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE2\n {\n let x := mload(TABLE2_X_LOC)\n let y := mload(TABLE2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))\n // accumulator_2 = u.[table2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE3\n {\n let x := mload(TABLE3_X_LOC)\n let y := mload(TABLE3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))\n // accumulator_2 = u.[table3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE4\n {\n let x := mload(TABLE4_X_LOC)\n let y := mload(TABLE4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))\n // accumulator_2 = u.[table4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE TABLE_TYPE\n {\n let x := mload(TABLE_TYPE_X_LOC)\n let y := mload(TABLE_TYPE_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V25_LOC))\n // accumulator_2 = v25.[TableType]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID1\n {\n let x := mload(ID1_X_LOC)\n let y := mload(ID1_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V26_LOC))\n // accumulator_2 = v26.[ID1]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID2\n {\n let x := mload(ID2_X_LOC)\n let y := mload(ID2_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V27_LOC))\n // accumulator_2 = v27.[ID2]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID3\n {\n let x := mload(ID3_X_LOC)\n let y := mload(ID3_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V28_LOC))\n // accumulator_2 = v28.[ID3]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE ID4\n {\n let x := mload(ID4_X_LOC)\n let y := mload(ID4_Y_LOC)\n let xx := mulmod(x, x, q)\n // Verification key fields verified to be on curve at contract deployment\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mload(C_V29_LOC))\n // accumulator_2 = v29.[ID4]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n /**\n * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER\n */\n {\n /**\n * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)\n * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)\n * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)\n * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)\n * batch_evaluation += v4 * (s_omega_eval * u + s_eval)\n * batch_evaluation += v5 * (z_omega_eval * u + z_eval)\n * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)\n */\n let batch_evaluation :=\n mulmod(\n mload(C_V0_LOC),\n addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V1_LOC),\n addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V2_LOC),\n addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V3_LOC),\n addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V4_LOC),\n addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V5_LOC),\n addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V6_LOC),\n addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),\n p\n ),\n p\n )\n\n /**\n * batch_evaluation += v7 * Q1_EVAL\n * batch_evaluation += v8 * Q2_EVAL\n * batch_evaluation += v9 * Q3_EVAL\n * batch_evaluation += v10 * Q4_EVAL\n * batch_evaluation += v11 * QM_EVAL\n * batch_evaluation += v12 * QC_EVAL\n * batch_evaluation += v13 * QARITH_EVAL\n * batch_evaluation += v14 * QSORT_EVAL_LOC\n * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC\n * batch_evaluation += v16 * QAUX_EVAL_LOC\n * batch_evaluation += v17 * SIGMA1_EVAL_LOC\n * batch_evaluation += v18 * SIGMA2_EVAL_LOC\n * batch_evaluation += v19 * SIGMA3_EVAL_LOC\n * batch_evaluation += v20 * SIGMA4_EVAL_LOC\n */\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)\n\n /**\n * batch_evaluation += v21 * (table1(zw) * u + table1(z))\n * batch_evaluation += v22 * (table2(zw) * u + table2(z))\n * batch_evaluation += v23 * (table3(zw) * u + table3(z))\n * batch_evaluation += v24 * (table4(zw) * u + table4(z))\n * batch_evaluation += v25 * table_type_eval\n * batch_evaluation += v26 * id1_eval\n * batch_evaluation += v27 * id2_eval\n * batch_evaluation += v28 * id3_eval\n * batch_evaluation += v29 * id4_eval\n * batch_evaluation += quotient_eval\n */\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V21_LOC),\n addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V22_LOC),\n addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V23_LOC),\n addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation :=\n addmod(\n batch_evaluation,\n mulmod(\n mload(C_V24_LOC),\n addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),\n p\n ),\n p\n )\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)\n batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)\n\n mstore(0x00, 0x01) // [1].x\n mstore(0x20, 0x02) // [1].y\n mstore(0x40, sub(p, batch_evaluation))\n // accumulator_2 = -[1].(batch_evaluation)\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n if iszero(success) {\n mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING PREAMBLE\n */\n {\n let u := mload(C_U_LOC)\n let zeta := mload(C_ZETA_LOC)\n // VALIDATE PI_Z\n {\n let x := mload(PI_Z_X_LOC)\n let y := mload(PI_Z_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute zeta.[PI_Z] and add into accumulator\n mstore(0x40, zeta)\n success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)\n // accumulator = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))\n\n // VALIDATE PI_Z_OMEGA\n {\n let x := mload(PI_Z_OMEGA_X_LOC)\n let y := mload(PI_Z_OMEGA_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))\n // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))\n // PAIRING_RHS = accumulator + accumulator_2\n success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n mstore(0x00, mload(PI_Z_X_LOC))\n mstore(0x20, mload(PI_Z_Y_LOC))\n mstore(0x40, mload(PI_Z_OMEGA_X_LOC))\n mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))\n mstore(0x80, u)\n success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))\n // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n // negate lhs y-coordinate\n mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))\n\n if mload(CONTAINS_RECURSIVE_PROOF_LOC) {\n // VALIDATE RECURSIVE P1\n {\n let x := mload(RECURSIVE_P1_X_LOC)\n let y := mload(RECURSIVE_P1_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n\n // compute u.u.[recursive_p1] and write into 0x60\n mstore(0x40, mulmod(u, u, p))\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))\n // VALIDATE RECURSIVE P2\n {\n let x := mload(RECURSIVE_P2_X_LOC)\n let y := mload(RECURSIVE_P2_Y_LOC)\n let xx := mulmod(x, x, q)\n // validate on curve\n if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {\n mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)\n revert(0x00, 0x04)\n }\n mstore(0x00, x)\n mstore(0x20, y)\n }\n // compute u.u.[recursive_p2] and write into 0x00\n // 0x40 still contains u*u\n success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))\n\n // compute u.u.[recursiveP1] + rhs and write into rhs\n mstore(0xa0, mload(PAIRING_RHS_X_LOC))\n mstore(0xc0, mload(PAIRING_RHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))\n\n // compute u.u.[recursiveP2] + lhs and write into lhs\n mstore(0x40, mload(PAIRING_LHS_X_LOC))\n mstore(0x60, mload(PAIRING_LHS_Y_LOC))\n success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))\n }\n\n if iszero(success) {\n mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n /**\n * PERFORM PAIRING\n */\n {\n // rhs paired with [1]_2\n // lhs paired with [x]_2\n\n mstore(0x00, mload(PAIRING_RHS_X_LOC))\n mstore(0x20, mload(PAIRING_RHS_Y_LOC))\n mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2\n mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)\n mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)\n mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)\n\n mstore(0xc0, mload(PAIRING_LHS_X_LOC))\n mstore(0xe0, mload(PAIRING_LHS_Y_LOC))\n mstore(0x100, mload(G2X_X0_LOC))\n mstore(0x120, mload(G2X_X1_LOC))\n mstore(0x140, mload(G2X_Y0_LOC))\n mstore(0x160, mload(G2X_Y1_LOC))\n\n success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)\n if iszero(and(success, mload(0x00))) {\n mstore(0x0, PAIRING_FAILED_SELECTOR)\n revert(0x00, 0x04)\n }\n }\n\n {\n mstore(0x00, 0x01)\n return(0x00, 0x20) // Proof succeeded!\n }\n }\n }\n}\n\ncontract UltraVerifier is BaseUltraVerifier {\n function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {\n return UltraVerificationKey.verificationKeyHash();\n }\n\n function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {\n UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);\n }\n}\n" + }, + "contracts/libraries/Field.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\ntype Field is uint256;\n\nlibrary ImplField {\n uint constant PRIME =\n 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001;\n uint constant PRIME_DIV_2 =\n 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;\n\n function checkField(Field a) internal pure {\n require(Field.unwrap(a) < PRIME, \"Field: input is too large\");\n }\n\n function toFieldUnchecked(uint256 a) internal pure returns (Field b) {\n b = Field.wrap(a);\n }\n function toField(uint256 a) internal pure returns (Field b) {\n b = Field.wrap(a);\n checkField(b);\n }\n\n function toFieldUnchecked(bytes32 a) internal pure returns (Field b) {\n assembly {\n b := a\n }\n }\n function toField(bytes32 a) internal pure returns (Field b) {\n assembly {\n b := a\n }\n checkField(b);\n }\n\n function toBytes32(Field a) internal pure returns (bytes32 b) {\n assembly {\n b := a\n }\n }\n\n function toAddress(Field a) internal pure returns (address b) {\n require(Field.unwrap(a) < (1 << 160), \"Field: input is too large\");\n assembly {\n b := a\n }\n }\n\n function toArr(Field a) internal pure returns (bytes32[] memory b) {\n b = new bytes32[](1);\n b[0] = toBytes32(a);\n }\n\n function toField(address a) internal pure returns (Field b) {\n assembly {\n b := a\n }\n }\n\n function toField(int256 a) internal pure returns (Field) {\n // return Field.wrap(a);\n if (a < 0) {\n require(uint(-a) < PRIME, \"Field: input is too large\");\n return Field.wrap(PRIME - uint256(-a));\n } else {\n require(uint(a) < PRIME, \"Field: input is too large\");\n return Field.wrap(uint256(a));\n }\n }\n\n function into(Field[] memory a) internal pure returns (bytes32[] memory b) {\n assembly {\n b := a\n }\n }\n\n function add(Field a, Field b) internal pure returns (Field c) {\n assembly {\n c := addmod(a, b, PRIME)\n }\n }\n\n function mul(Field a, Field b) internal pure returns (Field c) {\n assembly {\n c := mulmod(a, b, PRIME)\n }\n }\n\n function add(Field a, uint b) internal pure returns (Field c) {\n assembly {\n c := addmod(a, b, PRIME)\n }\n }\n\n function mul(Field a, uint b) internal pure returns (Field c) {\n assembly {\n c := mulmod(a, b, PRIME)\n }\n }\n\n function eq(Field a, Field b) internal pure returns (bool c) {\n assembly {\n c := eq(a, b)\n }\n }\n\n function isZero(Field a) internal pure returns (bool c) {\n assembly {\n c := eq(a, 0)\n }\n }\n\n function signed(\n Field a\n ) internal pure returns (bool positive, uint scalar) {\n uint256 raw = Field.unwrap(a);\n if (raw > PRIME_DIV_2) {\n return (false, PRIME - raw);\n } else {\n return (true, raw);\n }\n }\n}\n" + }, + "contracts/libraries/Poseidon2.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Field, ImplField} from \"./Field.sol\";\n\nlibrary Poseidon2 {\n using ImplField for Field;\n using Poseidon2 for Sponge;\n\n uint constant t = 4;\n uint constant rounds_f = 8;\n uint constant rounds_p = 56;\n uint constant RATE = 3;\n\n struct Constants {\n Field[4] internal_matrix_diagonal;\n Field[4][64] round_constant;\n }\n\n struct Sponge {\n Field iv;\n Field[3] cache;\n Field[4] state;\n uint cache_size;\n bool squeeze_mode; // 0 => absorb, 1 => squeeze\n Constants constants;\n }\n\n /**\n * Public API: best for single time use\n */\n\n function hash_1(Field m) internal pure returns (Field) {\n Field[] memory inputs = new Field[](1);\n inputs[0] = m;\n return hash_internal(load(), inputs, 1, false);\n }\n\n function hash_2(Field m1, Field m2) internal pure returns (Field) {\n Field[] memory inputs = new Field[](2);\n inputs[0] = m1;\n inputs[1] = m2;\n return hash_internal(load(), inputs, 2, false);\n }\n\n function hash_3(\n Field m1,\n Field m2,\n Field m3\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](3);\n inputs[0] = m1;\n inputs[1] = m2;\n inputs[2] = m3;\n return hash_internal(load(), inputs, 3, false);\n }\n\n function hash_var_len(\n Field[] memory inputs,\n uint std_input_length\n ) internal pure returns (Field) {\n return hash_internal(load(), inputs, std_input_length, true);\n }\n\n /**\n * Public API: best for multiple use in same call context\n */\n\n function hash_1(\n Poseidon2.Constants memory constants,\n Field m\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](1);\n inputs[0] = m;\n return hash_internal(constants, inputs, 1, false);\n }\n\n function hash_2(\n Poseidon2.Constants memory constants,\n Field m1,\n Field m2\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](2);\n inputs[0] = m1;\n inputs[1] = m2;\n return hash_internal(constants, inputs, 2, false);\n }\n\n function hash_3(\n Poseidon2.Constants memory constants,\n Field m1,\n Field m2,\n Field m3\n ) internal pure returns (Field) {\n Field[] memory inputs = new Field[](3);\n inputs[0] = m1;\n inputs[1] = m2;\n inputs[2] = m3;\n return hash_internal(constants, inputs, 3, false);\n }\n\n function hash_var_len(\n Poseidon2.Constants memory constants,\n Field[] memory inputs,\n uint std_input_length\n ) internal pure returns (Field) {\n return hash_internal(constants, inputs, std_input_length, true);\n }\n\n /**\n * Internal methods for hashing\n */\n\n // function hash_internal(\n // Poseidon2.Sponge memory sponge,\n // Field[] memory input,\n // uint std_input_length,\n // bool is_variable_length\n // ) private pure returns (Field) {\n // for (uint i; i < input.length; i++) {\n // if (i < std_input_length) {\n // sponge.absorb(input[i]);\n // }\n // }\n\n // // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // // fixed-length and variable-length hashes do not collide)\n // if (is_variable_length) {\n // sponge.absorb(Field.wrap(1));\n // }\n // return sponge.squeeze();\n // }\n\n function generate_iv(uint input_length) internal pure returns (Field) {\n return Field.wrap(input_length << 64);\n }\n\n function hash_internal(\n Constants memory constants,\n Field[] memory input,\n uint std_input_length,\n bool is_variable_length\n ) private pure returns (Field) {\n Poseidon2.Sponge memory sponge = new_poseidon2(\n generate_iv(input.length),\n constants\n );\n\n for (uint i; i < input.length; i++) {\n if (i < std_input_length) {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if (is_variable_length) {\n sponge.absorb(Field.wrap(1));\n }\n return sponge.squeeze();\n }\n\n function new_poseidon2(\n Field iv,\n Constants memory constants\n ) private pure returns (Poseidon2.Sponge memory) {\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\n iv: iv,\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n cache_size: 0,\n squeeze_mode: false,\n constants: constants\n });\n result.state[RATE] = iv;\n return result;\n }\n\n function new_poseidon2_with_constants(\n Field iv,\n Constants memory constants\n ) private pure returns (Poseidon2.Sponge memory) {\n Poseidon2.Sponge memory result = Poseidon2.Sponge({\n iv: iv,\n cache: [Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n state: [Field.wrap(0), Field.wrap(0), Field.wrap(0), Field.wrap(0)],\n cache_size: 0,\n squeeze_mode: false,\n constants: constants\n });\n result.state[RATE] = iv;\n return result;\n }\n\n function perform_duplex(\n Poseidon2.Sponge memory self\n ) internal pure returns (Field[RATE] memory) {\n // zero-pad the cache\n for (uint i; i < RATE; i++) {\n if (i >= self.cache_size) {\n self.cache[i] = Field.wrap(0);\n }\n }\n\n // add the cache into sponge state\n for (uint i; i < RATE; i++) {\n self.state[i] = self.state[i].add(self.cache[i]);\n }\n self.state = permutation(\n self.state,\n self.constants.internal_matrix_diagonal,\n self.constants.round_constant\n );\n // return `RATE` number of field elements from the sponge state.\n Field[RATE] memory result = [\n Field.wrap(0),\n Field.wrap(0),\n Field.wrap(0)\n ];\n for (uint i; i < RATE; i++) {\n result[i] = self.state[i];\n }\n return result;\n }\n\n function absorb(Poseidon2.Sponge memory self, Field input) internal pure {\n if ((!self.squeeze_mode) && (self.cache_size == RATE)) {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else if ((!self.squeeze_mode) && (self.cache_size != RATE)) {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n } else if (self.squeeze_mode) {\n // If we're in squeeze mode, switch to absorb mode and add the input into the cache.\n // N.B. I don't think this code path can be reached?!\n self.cache[0] = input;\n self.cache_size = 1;\n self.squeeze_mode = false;\n }\n }\n\n function squeeze(\n Poseidon2.Sponge memory self\n ) internal pure returns (Field) {\n if (self.squeeze_mode && (self.cache_size == 0)) {\n // If we're in squeze mode and the cache is empty, there is nothing left to squeeze out of the sponge!\n // Switch to absorb mode.\n self.squeeze_mode = false;\n self.cache_size = 0;\n }\n if (!self.squeeze_mode) {\n // If we're in absorb mode, apply sponge permutation to compress the cache, populate cache with compressed\n // state and switch to squeeze mode. Note: this code block will execute if the previous `if` condition was\n // matched\n Field[RATE] memory new_output_elements = self.perform_duplex();\n self.squeeze_mode = true;\n for (uint i; i < RATE; i++) {\n self.cache[i] = new_output_elements[i];\n }\n self.cache_size = RATE;\n }\n // By this point, we should have a non-empty cache. Pop one item off the top of the cache and return it.\n Field result = self.cache[0];\n for (uint i = 1; i < RATE; i++) {\n if (i < self.cache_size) {\n self.cache[i - 1] = self.cache[i];\n }\n }\n\n self.cache_size -= 1;\n self.cache[self.cache_size] = Field.wrap(0);\n return result;\n }\n\n function permutation(\n Field[4] memory inputs,\n Field[4] memory internal_matrix_diagonal,\n Field[4][64] memory round_constant\n ) private pure returns (Field[4] memory) {\n // Read witness assignments\n Field[4] memory state = [\n Field.wrap(0),\n Field.wrap(0),\n Field.wrap(0),\n Field.wrap(0)\n ];\n for (uint i; i < 4; i++) {\n state[i] = inputs[i];\n }\n\n // Apply 1st linear layer\n matrix_multiplication_4x4(state);\n\n // First set of external rounds\n uint rf_first = rounds_f / 2;\n for (uint r; r < rf_first; r++) {\n add_round_constants(state, round_constant, r);\n s_box(state);\n matrix_multiplication_4x4(state);\n }\n\n // Internal rounds\n uint p_end = rf_first + rounds_p;\n for (uint r = rf_first; r < p_end; r++) {\n state[0] = state[0].add(round_constant[r][0]);\n state[0] = single_box(state[0]);\n internal_m_multiplication(state, internal_matrix_diagonal);\n }\n\n // Remaining external rounds\n uint num_rounds = rounds_f + rounds_p;\n\n for (uint r = p_end; r < num_rounds; r++) {\n add_round_constants(state, round_constant, r);\n s_box(state);\n matrix_multiplication_4x4(state);\n }\n\n return state;\n }\n\n function single_box(Field x) private pure returns (Field) {\n Field s = x.mul(x);\n return s.mul(s).mul(x);\n }\n\n function s_box(Field[4] memory input) private pure {\n for (uint i; i < 4; i++) {\n input[i] = single_box(input[i]);\n }\n }\n\n function add_round_constants(\n Field[4] memory state,\n Field[4][64] memory round_constant,\n uint round\n ) private pure {\n for (uint i; i < 4; i++) {\n state[i] = state[i].add(round_constant[round][i]);\n }\n }\n\n function matrix_multiplication_4x4(Field[4] memory input) private pure {\n Field t0 = input[0].add(input[1]); // A + B\n Field t1 = input[2].add(input[3]); // C + D\n Field t2 = input[1].add(input[1]); // 2B\n t2 = t2.add(t1); // 2B + C + D\n Field t3 = input[3].add(input[3]); // 2D\n t3 = t3.add(t0); // 2D + A + B\n Field t4 = t1.add(t1);\n t4 = t4.add(t4);\n t4 = t4.add(t3); // A + B + 4C + 6D\n Field t5 = t0.add(t0);\n t5 = t5.add(t5);\n t5 = t5.add(t2); // 4A + 6B + C + D\n Field t6 = t3.add(t5); // 5A + 7B + C + 3D\n Field t7 = t2.add(t4); // A + 3B + 5C + 7D\n input[0] = t6;\n input[1] = t5;\n input[2] = t7;\n input[3] = t4;\n }\n\n function internal_m_multiplication(\n Field[4] memory input,\n Field[4] memory internal_matrix_diagonal\n ) private pure {\n Field sum = Field.wrap(0);\n for (uint i; i < 4; i++) {\n sum = sum.add(input[i]);\n }\n for (uint i; i < 4; i++) {\n input[i] = input[i].mul(internal_matrix_diagonal[i]);\n input[i] = input[i].add(sum);\n }\n }\n\n function load() internal pure returns (Constants memory constants) {\n constants = Constants({\n internal_matrix_diagonal: [\n Field.wrap(\n 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7\n ),\n Field.wrap(\n 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b\n ),\n Field.wrap(\n 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15\n ),\n Field.wrap(\n 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b\n )\n ],\n round_constant: [\n [\n Field.wrap(\n 0x19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5\n ),\n Field.wrap(\n 0x265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6\n ),\n Field.wrap(\n 0x199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa\n ),\n Field.wrap(\n 0x157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8\n )\n ],\n [\n Field.wrap(\n 0x2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902\n ),\n Field.wrap(\n 0x0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e\n ),\n Field.wrap(\n 0x251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996\n ),\n Field.wrap(\n 0x13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e\n )\n ],\n [\n Field.wrap(\n 0x0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738\n ),\n Field.wrap(\n 0x011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06\n ),\n Field.wrap(\n 0x0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549\n ),\n Field.wrap(\n 0x04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b\n )\n ],\n [\n Field.wrap(\n 0x0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8\n ),\n Field.wrap(\n 0x259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f\n ),\n Field.wrap(\n 0x28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1\n ),\n Field.wrap(\n 0x0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447\n )\n ],\n [\n Field.wrap(\n 0x0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n ),\n Field.wrap(\n 0x0000000000000000000000000000000000000000000000000000000000000000\n )\n ],\n [\n Field.wrap(\n 0x1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38\n ),\n Field.wrap(\n 0x0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5\n ),\n Field.wrap(\n 0x1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c\n ),\n Field.wrap(\n 0x25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f\n )\n ],\n [\n Field.wrap(\n 0x0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a\n ),\n Field.wrap(\n 0x13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96\n ),\n Field.wrap(\n 0x2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce\n ),\n Field.wrap(\n 0x21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959\n )\n ],\n [\n Field.wrap(\n 0x05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b\n ),\n Field.wrap(\n 0x0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4\n ),\n Field.wrap(\n 0x0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf\n ),\n Field.wrap(\n 0x09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455\n )\n ],\n [\n Field.wrap(\n 0x0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335\n ),\n Field.wrap(\n 0x2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b\n ),\n Field.wrap(\n 0x1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df\n ),\n Field.wrap(\n 0x176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404\n )\n ]\n ]\n });\n }\n}\n" + }, + "contracts/MerkleTreeWithHistory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Poseidon2} from \"./libraries/Poseidon2.sol\";\nimport {Field, ImplField} from \"./libraries/Field.sol\";\n\ncontract MerkleTreeWithHistory {\n using ImplField for Field;\n\n uint32 public levels;\n\n // the following variables are made public for easier testing and debugging and\n // are not supposed to be accessed in regular code\n\n // filledSubtrees and roots could be bytes32[size], but using mappings makes it cheaper because\n // it removes index range check on every interaction\n mapping(uint256 => Field) public filledSubtrees; // Field[depth]\n mapping(uint256 => Field) public roots; // Field[ROOT_HISTORY_SIZE]\n uint32 public constant ROOT_HISTORY_SIZE = 30;\n uint32 public currentRootIndex = 0;\n uint32 public nextIndex = 0;\n\n constructor(uint32 _levels) {\n require(_levels > 0, \"_levels should be greater than zero\");\n require(_levels <= 32, \"_levels should be less than eq 32\");\n levels = _levels;\n\n for (uint32 i = 0; i < _levels; i++) {\n filledSubtrees[i] = zeros(i);\n }\n\n roots[0] = zeros(_levels - 1);\n }\n\n function _insert(Field leaf) internal returns (uint32 index) {\n uint32 _nextIndex = nextIndex;\n require(\n _nextIndex != uint32(2) ** levels,\n \"Merkle tree is full. No more leaves can be added\"\n );\n uint32 currentIndex = _nextIndex;\n Field currentLevelHash = leaf;\n Field left;\n Field right;\n\n for (uint32 i = 0; i < levels; i++) {\n if (currentIndex % 2 == 0) {\n left = currentLevelHash;\n right = zeros(i);\n filledSubtrees[i] = currentLevelHash;\n } else {\n left = filledSubtrees[i];\n right = currentLevelHash;\n }\n currentLevelHash = Poseidon2.hash_2(left, right);\n currentIndex /= 2;\n }\n\n uint32 newRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE;\n currentRootIndex = newRootIndex;\n roots[newRootIndex] = currentLevelHash;\n nextIndex = _nextIndex + 1;\n return _nextIndex;\n }\n\n /**\n @dev Whether the root is present in the root history\n */\n function isKnownRoot(Field root) public view returns (bool) {\n if (root.isZero()) {\n return false;\n }\n uint32 _currentRootIndex = currentRootIndex;\n uint32 i = _currentRootIndex;\n do {\n if (root.eq(roots[i])) {\n return true;\n }\n if (i == 0) {\n i = ROOT_HISTORY_SIZE;\n }\n i--;\n } while (i != _currentRootIndex);\n return false;\n }\n\n /**\n @dev Returns the last root\n */\n function getLastRoot() public view returns (Field) {\n return roots[currentRootIndex];\n }\n\n /// @dev provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels\n function zeros(uint256 i) public pure returns (Field) {\n if (i == 0) return Field.wrap(0);\n else if (i == 1)\n return\n Field.wrap(\n 0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1\n );\n else if (i == 2)\n return\n Field.wrap(\n 0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290\n );\n else if (i == 3)\n return\n Field.wrap(\n 0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20\n );\n else if (i == 4)\n return\n Field.wrap(\n 0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e\n );\n else if (i == 5)\n return\n Field.wrap(\n 0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf\n );\n else if (i == 6)\n return\n Field.wrap(\n 0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76\n );\n else if (i == 7)\n return\n Field.wrap(\n 0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b\n );\n else if (i == 8)\n return\n Field.wrap(\n 0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1\n );\n else if (i == 9)\n return\n Field.wrap(\n 0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972\n );\n else if (i == 10)\n return\n Field.wrap(\n 0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686\n );\n else if (i == 11)\n return\n Field.wrap(\n 0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7\n );\n else if (i == 12)\n return\n Field.wrap(\n 0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73\n );\n else if (i == 13)\n return\n Field.wrap(\n 0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1\n );\n else if (i == 14)\n return\n Field.wrap(\n 0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a\n );\n else if (i == 15)\n return\n Field.wrap(\n 0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9\n );\n else if (i == 16)\n return\n Field.wrap(\n 0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3\n );\n else if (i == 17)\n return\n Field.wrap(\n 0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3\n );\n else if (i == 18)\n return\n Field.wrap(\n 0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5\n );\n else if (i == 19)\n return\n Field.wrap(\n 0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5\n );\n else if (i == 20)\n return\n Field.wrap(\n 0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755\n );\n else if (i == 21)\n return\n Field.wrap(\n 0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3\n );\n else if (i == 22)\n return\n Field.wrap(\n 0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30\n );\n else if (i == 23)\n return\n Field.wrap(\n 0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4\n );\n else if (i == 24)\n return\n Field.wrap(\n 0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491\n );\n else if (i == 25)\n return\n Field.wrap(\n 0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2\n );\n else if (i == 26)\n return\n Field.wrap(\n 0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9\n );\n else if (i == 27)\n return\n Field.wrap(\n 0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3\n );\n else if (i == 28)\n return\n Field.wrap(\n 0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f\n );\n else if (i == 29)\n return\n Field.wrap(\n 0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c\n );\n else if (i == 30)\n return\n Field.wrap(\n 0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee\n );\n else if (i == 31)\n return\n Field.wrap(\n 0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14\n );\n else if (i == 32)\n return\n Field.wrap(\n 0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d\n );\n else revert(\"Index out of bounds\");\n }\n}\n" + }, + "contracts/Pool.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {Create2} from \"@openzeppelin/contracts/utils/Create2.sol\";\nimport {Field, ImplField} from \"./libraries/Field.sol\";\nimport {SplitJoin16Verifier, Hash2Verifier, NoteVerifier} from \"./Verifier.sol\";\nimport {StealthAddress} from \"./StealthAddress.sol\";\nimport {MerkleTreeWithHistory} from \"./MerkleTreeWithHistory.sol\";\nimport \"hardhat/console.sol\";\n\ncontract Pool is MerkleTreeWithHistory {\n using ImplField for Field;\n using ImplField for uint256;\n using ImplField for int256;\n using ImplField for bytes32;\n using ImplField for address;\n using ImplField for Field[];\n\n Field constant FIELD_ZERO = Field.wrap(0);\n\n Field public constant ZERO_ROOT =\n Field.wrap(\n 0x087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf\n );\n Field public constant ZERO_COMMITMENT =\n Field.wrap(\n 0x0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a\n );\n Field public constant ZERO_NULLIFIER =\n Field.wrap(\n 0x262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb2\n );\n\n bytes32 public constant INIT_CODE_HASH =\n keccak256(type(StealthAddress).creationCode);\n\n IERC20 public usdc;\n SplitJoin16Verifier public splitJoinVerifier;\n Hash2Verifier public hash2Verifier;\n NoteVerifier public noteVerifier;\n\n mapping(Field nullifier => bool isSpent) public isNoteSpent;\n Field[] public noteCommitments;\n\n event NewCommitment(Field commitment);\n event NullifierSpent(Field commitment);\n\n constructor(\n SplitJoin16Verifier _splitJoinVerifier,\n Hash2Verifier _hash2Verifier,\n NoteVerifier _noteVerifier,\n IERC20 _usdc\n ) MerkleTreeWithHistory(16) {\n splitJoinVerifier = _splitJoinVerifier;\n hash2Verifier = _hash2Verifier;\n noteVerifier = _noteVerifier;\n usdc = _usdc;\n _insert(ZERO_COMMITMENT);\n }\n\n function deposit(\n uint amount,\n Field noteCommitment,\n bytes memory proof\n ) external {\n _createDepositUsingHash3(amount, noteCommitment, proof);\n }\n\n // proving split join takes about 5 seconds\n function transact(\n bytes memory proof,\n Field[] memory publicInputs\n ) external {\n // verify that the note has not been spent\n require(isKnownRoot(publicInputs[0]), \"Deposits root unknown\");\n (bool isDeposit, uint amount) = publicInputs[1].signed();\n\n if (!publicInputs[3].eq(ZERO_NULLIFIER)) {\n require(!isNoteSpent[publicInputs[3]], \"Note is spent\");\n isNoteSpent[publicInputs[3]] = true;\n emit NullifierSpent(publicInputs[3]);\n }\n if (!publicInputs[4].eq(ZERO_NULLIFIER)) {\n require(!isNoteSpent[publicInputs[4]], \"Note is spent\");\n isNoteSpent[publicInputs[4]] = true;\n emit NullifierSpent(publicInputs[4]);\n }\n\n require(\n splitJoinVerifier.verify(proof, publicInputs.into()),\n \"split join zk proof failed\"\n );\n\n // insert note in merkle tree and calculate new root\n emit NewCommitment(publicInputs[4]);\n noteCommitments.push(publicInputs[4]);\n _insert(publicInputs[4]);\n\n if (isDeposit) {\n // pull USDC\n usdc.transferFrom(msg.sender, address(this), amount);\n } else {\n // transfer USDC\n usdc.transfer(publicInputs[2].toAddress(), amount);\n }\n }\n\n function collect(\n IERC20 token,\n uint balance,\n Field salt,\n bytes memory stealthAddressOwnershipZkProof,\n Field noteCommitment,\n bytes memory noteCreationZkProof\n ) external {\n require(\n hash2Verifier.verify(stealthAddressOwnershipZkProof, salt.toArr()),\n \"hash2 zk proof failed\"\n );\n StealthAddress wallet = _deployIfNeeded(salt.toBytes32());\n wallet.transferErc20(token, address(this), balance);\n _createDepositUsingHash3(balance, noteCommitment, noteCreationZkProof);\n }\n\n function compute(Field salt) public view returns (address stealthAddress) {\n return Create2.computeAddress(salt.toBytes32(), INIT_CODE_HASH);\n }\n\n function _deployIfNeeded(bytes32 salt) internal returns (StealthAddress) {\n address computed = Create2.computeAddress(salt, INIT_CODE_HASH);\n uint size;\n assembly {\n size := extcodesize(computed)\n }\n if (size == 0) {\n bytes memory bytecode = type(StealthAddress).creationCode;\n address deployed;\n assembly {\n deployed := create2(\n 0,\n add(bytecode, 0x20),\n mload(bytecode),\n salt\n )\n }\n require(\n deployed != address(0),\n \"WalletFactory: failed to deploy wallet\"\n );\n require(deployed == computed, \"WalletFactory: deploy mismatch\");\n }\n return StealthAddress(payable(computed));\n }\n\n // proving note takes about 1 sec\n function _createDepositUsingHash3(\n uint amount,\n Field noteCommitment,\n bytes memory proof\n ) internal {\n // verify that amount is in note commitment preimage using the zk proof\n Field[] memory publicInputs = new Field[](2);\n publicInputs[0] = amount.toField();\n publicInputs[1] = noteCommitment;\n\n require(\n noteVerifier.verify(proof, publicInputs.into()),\n \"note zk proof failed\"\n );\n\n // insert note in merkle tree and calculate new root\n // TODO this requires poseidon2 to be implemented in solidity,\n // temporarily taking this from solidity\n // proving the new deposit root will cause mutex issue hence\n // we have to do poseidon2 in solidity to allow parallel users.\n noteCommitments.push(noteCommitment);\n _insert(noteCommitment);\n }\n\n // proving split join takes about 5 seconds\n function _createDepositUsingSplitJoin(\n uint amount,\n Field noteCommitment,\n bytes memory proof\n ) internal {\n // verify that amount is in note commitment preimage using the zk proof\n Field[] memory publicInputs = new Field[](6);\n publicInputs[0] = ZERO_ROOT;\n publicInputs[1] = amount.toField();\n publicInputs[2] = FIELD_ZERO;\n publicInputs[3] = ZERO_NULLIFIER;\n publicInputs[4] = ZERO_NULLIFIER;\n publicInputs[5] = noteCommitment;\n\n require(\n splitJoinVerifier.verify(proof, publicInputs.into()),\n \"split join zk proof failed\"\n );\n\n // insert note in merkle tree and calculate new root\n // TODO this requires poseidon2 to be implemented in solidity,\n // temporarily taking this from solidity\n // proving the new deposit root will cause mutex issue hence\n // we have to do poseidon2 in solidity to allow parallel users.\n noteCommitments.push(noteCommitment);\n _insert(noteCommitment);\n }\n}\n" + }, + "contracts/StealthAddress.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ncontract StealthAddress {\n address public pool;\n\n constructor() {\n pool = msg.sender;\n }\n\n modifier onlyPool() {\n require(msg.sender == pool, \"only factory\");\n _;\n }\n\n receive() external payable {}\n\n function transferErc20(\n IERC20 token,\n address dest,\n uint amount\n ) external onlyPool returns (bool success) {\n return token.transfer(dest, amount);\n }\n\n function call(\n address dest,\n uint value,\n bytes calldata data\n ) external onlyPool returns (bool success, bytes memory returndata) {\n (success, returndata) = dest.call{value: value}(data);\n }\n}\n" + }, + "contracts/test/FieldTest.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Field, ImplField} from \"../libraries/Field.sol\";\nimport \"hardhat/console.sol\";\n\ncontract FieldTest {\n using ImplField for Field;\n using ImplField for uint256;\n using ImplField for int256;\n using ImplField for bytes32;\n}\n" + }, + "contracts/test/Poseidon2Test.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Field, ImplField} from \"../libraries/Field.sol\";\nimport {Poseidon2} from \"../libraries/Poseidon2.sol\";\n\ncontract Poseidon2Test {\n using ImplField for Field;\n using ImplField for uint256;\n using ImplField for int256;\n using ImplField for bytes32;\n using Poseidon2 for Poseidon2.Constants;\n\n function hash_1(Field m1) public pure returns (Field) {\n return Poseidon2.hash_1(m1);\n }\n\n function hash_1_twice(Field m1) public pure returns (Field) {\n Poseidon2.Constants memory poseidon = Poseidon2.load();\n poseidon.hash_1(m1); // temp\n return poseidon.hash_1(m1);\n }\n\n function hash_2(Field m1, Field m2) public pure returns (Field) {\n return Poseidon2.hash_2(m1, m2);\n }\n\n function hash_3(Field m1, Field m2, Field m3) public pure returns (Field) {\n return Poseidon2.hash_3(m1, m2, m3);\n }\n}\n" + }, + "contracts/USDC.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract USDC is ERC20 {\n constructor() ERC20(\"USDC\", \"USDC\") {\n _mint(msg.sender, 1_000_000_000e6);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return 6;\n }\n}\n" + }, + "contracts/Verifier.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {UltraVerifier as SplitJoin16Verifier_} from \"@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol\";\nimport {UltraVerifier as SplitJoin32Verifier_} from \"@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol\";\nimport {UltraVerifier as Hash2Verifier_} from \"@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol\";\nimport {UltraVerifier as NoteVerifier_} from \"@ultralane/circuits/bin/note/contract/note/plonk_vk.sol\";\n\ncontract SplitJoin16Verifier is SplitJoin16Verifier_ {}\n\ncontract SplitJoin32Verifier is SplitJoin32Verifier_ {}\n\ncontract Hash2Verifier is Hash2Verifier_ {}\n\ncontract NoteVerifier is NoteVerifier_ {}\n" + }, + "hardhat/console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS =\n 0x000000000000000000636F6e736F6c652e6c6f67;\n\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\n address consoleAddress = CONSOLE_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n pop(\n staticcall(\n gas(),\n consoleAddress,\n add(payload, 32),\n mload(payload),\n 0,\n 0\n )\n )\n }\n }\n\n function _castToPure(\n function(bytes memory) internal view fnIn\n ) internal pure returns (function(bytes memory) pure fnOut) {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castToPure(_sendLogPayloadImplementation)(payload);\n }\n\n function log() internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n function logInt(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", p0));\n }\n\n function logUint(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function logString(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function log(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256)\", p0, p1));\n }\n\n function log(uint256 p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string)\", p0, p1));\n }\n\n function log(uint256 p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool)\", p0, p1));\n }\n\n function log(uint256 p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address)\", p0, p1));\n }\n\n function log(string memory p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 5000 + }, + "evmVersion": "paris", + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/src/contracts/index.ts b/src/contracts/index.ts new file mode 100644 index 0000000..262b77d --- /dev/null +++ b/src/contracts/index.ts @@ -0,0 +1,35 @@ +import { ContractRunner } from 'ethers'; + +import SepoliaPool from './deployments/sepolia/Pool.json'; +import SepoliaUSDC from './deployments/sepolia/USDC.json'; + +import ArbsepPool from './deployments/arbsep/Pool.json'; +import ArbsepUSDC from './deployments/arbsep/USDC.json'; + +import { Pool__factory, USDC__factory } from './typechain-types'; + +export async function getContracts(runner: ContractRunner) { + const network = await runner.provider?.getNetwork(); + const addresses = getAddresses(network!.chainId); + return { + pool: Pool__factory.connect(addresses.pool, runner), + usdc: USDC__factory.connect(addresses.usdc, runner), + }; +} + +export function getAddresses(chainId: bigint) { + switch (chainId) { + case 11155111n: + return { + pool: SepoliaPool.address, + usdc: SepoliaUSDC.address, + }; + case 421614n: + return { + pool: ArbsepPool.address, + usdc: ArbsepUSDC.address, + }; + default: + throw new Error(`ChainId ${chainId} not supported`); + } +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/index.ts b/src/contracts/typechain-types/@openzeppelin/contracts/index.ts new file mode 100644 index 0000000..d9c6d2e --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/index.ts @@ -0,0 +1,9 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as interfaces from "./interfaces"; +export type { interfaces }; +import type * as token from "./token"; +export type { token }; +import type * as utils from "./utils"; +export type { utils }; diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts new file mode 100644 index 0000000..959e42d --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts @@ -0,0 +1,69 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, +} from "../../../../common"; + +export interface IERC1155ErrorsInterface extends Interface {} + +export interface IERC1155Errors extends BaseContract { + connect(runner?: ContractRunner | null): IERC1155Errors; + waitForDeployment(): Promise; + + interface: IERC1155ErrorsInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts new file mode 100644 index 0000000..0469922 --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts @@ -0,0 +1,69 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, +} from "../../../../common"; + +export interface IERC20ErrorsInterface extends Interface {} + +export interface IERC20Errors extends BaseContract { + connect(runner?: ContractRunner | null): IERC20Errors; + waitForDeployment(): Promise; + + interface: IERC20ErrorsInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts new file mode 100644 index 0000000..39b0d2b --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts @@ -0,0 +1,69 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, +} from "../../../../common"; + +export interface IERC721ErrorsInterface extends Interface {} + +export interface IERC721Errors extends BaseContract { + connect(runner?: ContractRunner | null): IERC721Errors; + waitForDeployment(): Promise; + + interface: IERC721ErrorsInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts new file mode 100644 index 0000000..9415fdf --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { IERC1155Errors } from "./IERC1155Errors"; +export type { IERC20Errors } from "./IERC20Errors"; +export type { IERC721Errors } from "./IERC721Errors"; diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/index.ts b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/index.ts new file mode 100644 index 0000000..d70b374 --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/interfaces/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as draftIerc6093Sol from "./draft-IERC6093.sol"; +export type { draftIerc6093Sol }; diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts new file mode 100644 index 0000000..4673689 --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts @@ -0,0 +1,286 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../../../../common"; + +export interface ERC20Interface extends Interface { + getFunction( + nameOrSignature: + | "allowance" + | "approve" + | "balanceOf" + | "decimals" + | "name" + | "symbol" + | "totalSupply" + | "transfer" + | "transferFrom" + ): FunctionFragment; + + getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment; + + encodeFunctionData( + functionFragment: "allowance", + values: [AddressLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [AddressLike] + ): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transfer", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [AddressLike, AddressLike, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; +} + +export namespace ApprovalEvent { + export type InputTuple = [ + owner: AddressLike, + spender: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [owner: string, spender: string, value: bigint]; + export interface OutputObject { + owner: string; + spender: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TransferEvent { + export type InputTuple = [ + from: AddressLike, + to: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [from: string, to: string, value: bigint]; + export interface OutputObject { + from: string; + to: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface ERC20 extends BaseContract { + connect(runner?: ContractRunner | null): ERC20; + waitForDeployment(): Promise; + + interface: ERC20Interface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + allowance: TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + + approve: TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">; + + decimals: TypedContractMethod<[], [bigint], "view">; + + name: TypedContractMethod<[], [string], "view">; + + symbol: TypedContractMethod<[], [string], "view">; + + totalSupply: TypedContractMethod<[], [bigint], "view">; + + transfer: TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + transferFrom: TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "allowance" + ): TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "approve" + ): TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "balanceOf" + ): TypedContractMethod<[account: AddressLike], [bigint], "view">; + getFunction( + nameOrSignature: "decimals" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "name" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "symbol" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "totalSupply" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "transfer" + ): TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "transferFrom" + ): TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getEvent( + key: "Approval" + ): TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + getEvent( + key: "Transfer" + ): TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + + filters: { + "Approval(address,address,uint256)": TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + Approval: TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + + "Transfer(address,address,uint256)": TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + Transfer: TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + }; +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts new file mode 100644 index 0000000..d800ff3 --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts @@ -0,0 +1,262 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../../../../common"; + +export interface IERC20Interface extends Interface { + getFunction( + nameOrSignature: + | "allowance" + | "approve" + | "balanceOf" + | "totalSupply" + | "transfer" + | "transferFrom" + ): FunctionFragment; + + getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment; + + encodeFunctionData( + functionFragment: "allowance", + values: [AddressLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transfer", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [AddressLike, AddressLike, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; +} + +export namespace ApprovalEvent { + export type InputTuple = [ + owner: AddressLike, + spender: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [owner: string, spender: string, value: bigint]; + export interface OutputObject { + owner: string; + spender: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TransferEvent { + export type InputTuple = [ + from: AddressLike, + to: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [from: string, to: string, value: bigint]; + export interface OutputObject { + from: string; + to: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface IERC20 extends BaseContract { + connect(runner?: ContractRunner | null): IERC20; + waitForDeployment(): Promise; + + interface: IERC20Interface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + allowance: TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + + approve: TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">; + + totalSupply: TypedContractMethod<[], [bigint], "view">; + + transfer: TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + transferFrom: TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "allowance" + ): TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "approve" + ): TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "balanceOf" + ): TypedContractMethod<[account: AddressLike], [bigint], "view">; + getFunction( + nameOrSignature: "totalSupply" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "transfer" + ): TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "transferFrom" + ): TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getEvent( + key: "Approval" + ): TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + getEvent( + key: "Transfer" + ): TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + + filters: { + "Approval(address,address,uint256)": TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + Approval: TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + + "Transfer(address,address,uint256)": TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + Transfer: TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + }; +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts new file mode 100644 index 0000000..6b50935 --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts @@ -0,0 +1,286 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../../../../../common"; + +export interface IERC20MetadataInterface extends Interface { + getFunction( + nameOrSignature: + | "allowance" + | "approve" + | "balanceOf" + | "decimals" + | "name" + | "symbol" + | "totalSupply" + | "transfer" + | "transferFrom" + ): FunctionFragment; + + getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment; + + encodeFunctionData( + functionFragment: "allowance", + values: [AddressLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [AddressLike] + ): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transfer", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [AddressLike, AddressLike, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; +} + +export namespace ApprovalEvent { + export type InputTuple = [ + owner: AddressLike, + spender: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [owner: string, spender: string, value: bigint]; + export interface OutputObject { + owner: string; + spender: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TransferEvent { + export type InputTuple = [ + from: AddressLike, + to: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [from: string, to: string, value: bigint]; + export interface OutputObject { + from: string; + to: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface IERC20Metadata extends BaseContract { + connect(runner?: ContractRunner | null): IERC20Metadata; + waitForDeployment(): Promise; + + interface: IERC20MetadataInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + allowance: TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + + approve: TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">; + + decimals: TypedContractMethod<[], [bigint], "view">; + + name: TypedContractMethod<[], [string], "view">; + + symbol: TypedContractMethod<[], [string], "view">; + + totalSupply: TypedContractMethod<[], [bigint], "view">; + + transfer: TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + transferFrom: TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "allowance" + ): TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "approve" + ): TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "balanceOf" + ): TypedContractMethod<[account: AddressLike], [bigint], "view">; + getFunction( + nameOrSignature: "decimals" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "name" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "symbol" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "totalSupply" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "transfer" + ): TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "transferFrom" + ): TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getEvent( + key: "Approval" + ): TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + getEvent( + key: "Transfer" + ): TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + + filters: { + "Approval(address,address,uint256)": TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + Approval: TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + + "Transfer(address,address,uint256)": TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + Transfer: TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + }; +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts new file mode 100644 index 0000000..6044cde --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { IERC20Metadata } from "./IERC20Metadata"; diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts new file mode 100644 index 0000000..cc19697 --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts @@ -0,0 +1,7 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as extensions from "./extensions"; +export type { extensions }; +export type { ERC20 } from "./ERC20"; +export type { IERC20 } from "./IERC20"; diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/token/index.ts b/src/contracts/typechain-types/@openzeppelin/contracts/token/index.ts new file mode 100644 index 0000000..5c4062a --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/token/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as erc20 from "./ERC20"; +export type { erc20 }; diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/utils/Create2.ts b/src/contracts/typechain-types/@openzeppelin/contracts/utils/Create2.ts new file mode 100644 index 0000000..ff62c7b --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/utils/Create2.ts @@ -0,0 +1,69 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, +} from "../../../common"; + +export interface Create2Interface extends Interface {} + +export interface Create2 extends BaseContract { + connect(runner?: ContractRunner | null): Create2; + waitForDeployment(): Promise; + + interface: Create2Interface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@openzeppelin/contracts/utils/index.ts b/src/contracts/typechain-types/@openzeppelin/contracts/utils/index.ts new file mode 100644 index 0000000..1bc7afc --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/contracts/utils/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { Create2 } from "./Create2"; diff --git a/src/contracts/typechain-types/@openzeppelin/index.ts b/src/contracts/typechain-types/@openzeppelin/index.ts new file mode 100644 index 0000000..a11e4ca --- /dev/null +++ b/src/contracts/typechain-types/@openzeppelin/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as contracts from "./contracts"; +export type { contracts }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts new file mode 100644 index 0000000..8ac051f --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as plonkVkSol from "./plonk_vk.sol"; +export type { plonkVkSol }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier.ts new file mode 100644 index 0000000..1277635 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface BaseUltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface BaseUltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): BaseUltraVerifier; + waitForDeployment(): Promise; + + interface: BaseUltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier.ts new file mode 100644 index 0000000..2ab3423 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface UltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface UltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): UltraVerifier; + waitForDeployment(): Promise; + + interface: UltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts new file mode 100644 index 0000000..72545bb --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { BaseUltraVerifier } from "./BaseUltraVerifier"; +export type { UltraVerifier } from "./UltraVerifier"; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/index.ts new file mode 100644 index 0000000..8df7d32 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/contract/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as hash2 from "./hash_2"; +export type { hash2 }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/index.ts new file mode 100644 index 0000000..99cb299 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/hash_2/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as contract from "./contract"; +export type { contract }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/index.ts new file mode 100644 index 0000000..7f5124f --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/index.ts @@ -0,0 +1,11 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as hash2 from "./hash_2"; +export type { hash2 }; +import type * as note from "./note"; +export type { note }; +import type * as splitJoin16 from "./split_join_16"; +export type { splitJoin16 }; +import type * as splitJoin32 from "./split_join_32"; +export type { splitJoin32 }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/index.ts new file mode 100644 index 0000000..44fb8b7 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as note from "./note"; +export type { note }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/index.ts new file mode 100644 index 0000000..8ac051f --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as plonkVkSol from "./plonk_vk.sol"; +export type { plonkVkSol }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier.ts new file mode 100644 index 0000000..1277635 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface BaseUltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface BaseUltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): BaseUltraVerifier; + waitForDeployment(): Promise; + + interface: BaseUltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier.ts new file mode 100644 index 0000000..2ab3423 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface UltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface UltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): UltraVerifier; + waitForDeployment(): Promise; + + interface: UltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts new file mode 100644 index 0000000..72545bb --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { BaseUltraVerifier } from "./BaseUltraVerifier"; +export type { UltraVerifier } from "./UltraVerifier"; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/note/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/note/index.ts new file mode 100644 index 0000000..99cb299 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/note/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as contract from "./contract"; +export type { contract }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/index.ts new file mode 100644 index 0000000..cba48f4 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as splitJoin16 from "./split_join_16"; +export type { splitJoin16 }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts new file mode 100644 index 0000000..8ac051f --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as plonkVkSol from "./plonk_vk.sol"; +export type { plonkVkSol }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier.ts new file mode 100644 index 0000000..1277635 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface BaseUltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface BaseUltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): BaseUltraVerifier; + waitForDeployment(): Promise; + + interface: BaseUltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier.ts new file mode 100644 index 0000000..2ab3423 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface UltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface UltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): UltraVerifier; + waitForDeployment(): Promise; + + interface: UltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts new file mode 100644 index 0000000..72545bb --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { BaseUltraVerifier } from "./BaseUltraVerifier"; +export type { UltraVerifier } from "./UltraVerifier"; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/index.ts new file mode 100644 index 0000000..99cb299 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_16/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as contract from "./contract"; +export type { contract }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/index.ts new file mode 100644 index 0000000..022dfc0 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as splitJoin32 from "./split_join_32"; +export type { splitJoin32 }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts new file mode 100644 index 0000000..8ac051f --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as plonkVkSol from "./plonk_vk.sol"; +export type { plonkVkSol }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier.ts new file mode 100644 index 0000000..1277635 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface BaseUltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface BaseUltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): BaseUltraVerifier; + waitForDeployment(): Promise; + + interface: BaseUltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier.ts new file mode 100644 index 0000000..2ab3423 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../../../../common"; + +export interface UltraVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface UltraVerifier extends BaseContract { + connect(runner?: ContractRunner | null): UltraVerifier; + waitForDeployment(): Promise; + + interface: UltraVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts new file mode 100644 index 0000000..72545bb --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { BaseUltraVerifier } from "./BaseUltraVerifier"; +export type { UltraVerifier } from "./UltraVerifier"; diff --git a/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/index.ts b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/index.ts new file mode 100644 index 0000000..99cb299 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/bin/split_join_32/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as contract from "./contract"; +export type { contract }; diff --git a/src/contracts/typechain-types/@ultralane/circuits/index.ts b/src/contracts/typechain-types/@ultralane/circuits/index.ts new file mode 100644 index 0000000..9395464 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/circuits/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as bin from "./bin"; +export type { bin }; diff --git a/src/contracts/typechain-types/@ultralane/index.ts b/src/contracts/typechain-types/@ultralane/index.ts new file mode 100644 index 0000000..18d8b02 --- /dev/null +++ b/src/contracts/typechain-types/@ultralane/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as circuits from "./circuits"; +export type { circuits }; diff --git a/src/contracts/typechain-types/common.ts b/src/contracts/typechain-types/common.ts new file mode 100644 index 0000000..56b5f21 --- /dev/null +++ b/src/contracts/typechain-types/common.ts @@ -0,0 +1,131 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + FunctionFragment, + Typed, + EventFragment, + ContractTransaction, + ContractTransactionResponse, + DeferredTopicFilter, + EventLog, + TransactionRequest, + LogDescription, +} from "ethers"; + +export interface TypedDeferredTopicFilter<_TCEvent extends TypedContractEvent> + extends DeferredTopicFilter {} + +export interface TypedContractEvent< + InputTuple extends Array = any, + OutputTuple extends Array = any, + OutputObject = any +> { + (...args: Partial): TypedDeferredTopicFilter< + TypedContractEvent + >; + name: string; + fragment: EventFragment; + getFragment(...args: Partial): EventFragment; +} + +type __TypechainAOutputTuple = T extends TypedContractEvent< + infer _U, + infer W +> + ? W + : never; +type __TypechainOutputObject = T extends TypedContractEvent< + infer _U, + infer _W, + infer V +> + ? V + : never; + +export interface TypedEventLog + extends Omit { + args: __TypechainAOutputTuple & __TypechainOutputObject; +} + +export interface TypedLogDescription + extends Omit { + args: __TypechainAOutputTuple & __TypechainOutputObject; +} + +export type TypedListener = ( + ...listenerArg: [ + ...__TypechainAOutputTuple, + TypedEventLog, + ...undefined[] + ] +) => void; + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; + +export type StateMutability = "nonpayable" | "payable" | "view"; + +export type BaseOverrides = Omit; +export type NonPayableOverrides = Omit< + BaseOverrides, + "value" | "blockTag" | "enableCcipRead" +>; +export type PayableOverrides = Omit< + BaseOverrides, + "blockTag" | "enableCcipRead" +>; +export type ViewOverrides = Omit; +export type Overrides = S extends "nonpayable" + ? NonPayableOverrides + : S extends "payable" + ? PayableOverrides + : ViewOverrides; + +export type PostfixOverrides, S extends StateMutability> = + | A + | [...A, Overrides]; +export type ContractMethodArgs< + A extends Array, + S extends StateMutability +> = PostfixOverrides<{ [I in keyof A]-?: A[I] | Typed }, S>; + +export type DefaultReturnType = R extends Array ? R[0] : R; + +// export interface ContractMethod = Array, R = any, D extends R | ContractTransactionResponse = R | ContractTransactionResponse> { +export interface TypedContractMethod< + A extends Array = Array, + R = any, + S extends StateMutability = "payable" +> { + (...args: ContractMethodArgs): S extends "view" + ? Promise> + : Promise; + + name: string; + + fragment: FunctionFragment; + + getFragment(...args: ContractMethodArgs): FunctionFragment; + + populateTransaction( + ...args: ContractMethodArgs + ): Promise; + staticCall( + ...args: ContractMethodArgs + ): Promise>; + send(...args: ContractMethodArgs): Promise; + estimateGas(...args: ContractMethodArgs): Promise; + staticCallResult(...args: ContractMethodArgs): Promise; +} diff --git a/src/contracts/typechain-types/contracts/Lock.ts b/src/contracts/typechain-types/contracts/Lock.ts new file mode 100644 index 0000000..4229e89 --- /dev/null +++ b/src/contracts/typechain-types/contracts/Lock.ts @@ -0,0 +1,140 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../common"; + +export interface LockInterface extends Interface { + getFunction( + nameOrSignature: "owner" | "unlockTime" | "withdraw" + ): FunctionFragment; + + getEvent(nameOrSignatureOrTopic: "Withdrawal"): EventFragment; + + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "unlockTime", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "withdraw", values?: undefined): string; + + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unlockTime", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; +} + +export namespace WithdrawalEvent { + export type InputTuple = [amount: BigNumberish, when: BigNumberish]; + export type OutputTuple = [amount: bigint, when: bigint]; + export interface OutputObject { + amount: bigint; + when: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface Lock extends BaseContract { + connect(runner?: ContractRunner | null): Lock; + waitForDeployment(): Promise; + + interface: LockInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + owner: TypedContractMethod<[], [string], "view">; + + unlockTime: TypedContractMethod<[], [bigint], "view">; + + withdraw: TypedContractMethod<[], [void], "nonpayable">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "unlockTime" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "withdraw" + ): TypedContractMethod<[], [void], "nonpayable">; + + getEvent( + key: "Withdrawal" + ): TypedContractEvent< + WithdrawalEvent.InputTuple, + WithdrawalEvent.OutputTuple, + WithdrawalEvent.OutputObject + >; + + filters: { + "Withdrawal(uint256,uint256)": TypedContractEvent< + WithdrawalEvent.InputTuple, + WithdrawalEvent.OutputTuple, + WithdrawalEvent.OutputObject + >; + Withdrawal: TypedContractEvent< + WithdrawalEvent.InputTuple, + WithdrawalEvent.OutputTuple, + WithdrawalEvent.OutputObject + >; + }; +} diff --git a/src/contracts/typechain-types/contracts/MerkleTreeWithHistory.ts b/src/contracts/typechain-types/contracts/MerkleTreeWithHistory.ts new file mode 100644 index 0000000..9c31dbe --- /dev/null +++ b/src/contracts/typechain-types/contracts/MerkleTreeWithHistory.ts @@ -0,0 +1,182 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../common"; + +export interface MerkleTreeWithHistoryInterface extends Interface { + getFunction( + nameOrSignature: + | "ROOT_HISTORY_SIZE" + | "currentRootIndex" + | "filledSubtrees" + | "getLastRoot" + | "isKnownRoot" + | "levels" + | "nextIndex" + | "roots" + | "zeros" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ROOT_HISTORY_SIZE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "currentRootIndex", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "filledSubtrees", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getLastRoot", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isKnownRoot", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "levels", values?: undefined): string; + encodeFunctionData(functionFragment: "nextIndex", values?: undefined): string; + encodeFunctionData(functionFragment: "roots", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "zeros", values: [BigNumberish]): string; + + decodeFunctionResult( + functionFragment: "ROOT_HISTORY_SIZE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "currentRootIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "filledSubtrees", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isKnownRoot", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "levels", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "nextIndex", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "roots", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "zeros", data: BytesLike): Result; +} + +export interface MerkleTreeWithHistory extends BaseContract { + connect(runner?: ContractRunner | null): MerkleTreeWithHistory; + waitForDeployment(): Promise; + + interface: MerkleTreeWithHistoryInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + ROOT_HISTORY_SIZE: TypedContractMethod<[], [bigint], "view">; + + currentRootIndex: TypedContractMethod<[], [bigint], "view">; + + filledSubtrees: TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + + getLastRoot: TypedContractMethod<[], [bigint], "view">; + + isKnownRoot: TypedContractMethod<[root: BigNumberish], [boolean], "view">; + + levels: TypedContractMethod<[], [bigint], "view">; + + nextIndex: TypedContractMethod<[], [bigint], "view">; + + roots: TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + + zeros: TypedContractMethod<[i: BigNumberish], [bigint], "view">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "ROOT_HISTORY_SIZE" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "currentRootIndex" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "filledSubtrees" + ): TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + getFunction( + nameOrSignature: "getLastRoot" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "isKnownRoot" + ): TypedContractMethod<[root: BigNumberish], [boolean], "view">; + getFunction( + nameOrSignature: "levels" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "nextIndex" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "roots" + ): TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + getFunction( + nameOrSignature: "zeros" + ): TypedContractMethod<[i: BigNumberish], [bigint], "view">; + + filters: {}; +} diff --git a/src/contracts/typechain-types/contracts/Pool.ts b/src/contracts/typechain-types/contracts/Pool.ts new file mode 100644 index 0000000..12e47ad --- /dev/null +++ b/src/contracts/typechain-types/contracts/Pool.ts @@ -0,0 +1,471 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../common"; + +export interface PoolInterface extends Interface { + getFunction( + nameOrSignature: + | "INIT_CODE_HASH" + | "ROOT_HISTORY_SIZE" + | "ZERO_COMMITMENT" + | "ZERO_NULLIFIER" + | "ZERO_ROOT" + | "collect" + | "compute" + | "currentRootIndex" + | "deposit" + | "filledSubtrees" + | "getLastRoot" + | "hash2Verifier" + | "isKnownRoot" + | "isNoteSpent" + | "levels" + | "nextIndex" + | "noteCommitments" + | "noteVerifier" + | "roots" + | "splitJoinVerifier" + | "transact" + | "usdc" + | "zeros" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: "NewCommitment" | "NullifierSpent" + ): EventFragment; + + encodeFunctionData( + functionFragment: "INIT_CODE_HASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "ROOT_HISTORY_SIZE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "ZERO_COMMITMENT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "ZERO_NULLIFIER", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "ZERO_ROOT", values?: undefined): string; + encodeFunctionData( + functionFragment: "collect", + values: [ + AddressLike, + BigNumberish, + BigNumberish, + BytesLike, + BigNumberish, + BytesLike + ] + ): string; + encodeFunctionData( + functionFragment: "compute", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "currentRootIndex", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "deposit", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "filledSubtrees", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getLastRoot", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "hash2Verifier", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isKnownRoot", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "isNoteSpent", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "levels", values?: undefined): string; + encodeFunctionData(functionFragment: "nextIndex", values?: undefined): string; + encodeFunctionData( + functionFragment: "noteCommitments", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "noteVerifier", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "roots", values: [BigNumberish]): string; + encodeFunctionData( + functionFragment: "splitJoinVerifier", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transact", + values: [BytesLike, BigNumberish[]] + ): string; + encodeFunctionData(functionFragment: "usdc", values?: undefined): string; + encodeFunctionData(functionFragment: "zeros", values: [BigNumberish]): string; + + decodeFunctionResult( + functionFragment: "INIT_CODE_HASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "ROOT_HISTORY_SIZE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "ZERO_COMMITMENT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "ZERO_NULLIFIER", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "ZERO_ROOT", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "collect", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "compute", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "currentRootIndex", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "filledSubtrees", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "hash2Verifier", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isKnownRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isNoteSpent", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "levels", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "nextIndex", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "noteCommitments", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "noteVerifier", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "roots", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "splitJoinVerifier", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "transact", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "usdc", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "zeros", data: BytesLike): Result; +} + +export namespace NewCommitmentEvent { + export type InputTuple = [commitment: BigNumberish]; + export type OutputTuple = [commitment: bigint]; + export interface OutputObject { + commitment: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace NullifierSpentEvent { + export type InputTuple = [commitment: BigNumberish]; + export type OutputTuple = [commitment: bigint]; + export interface OutputObject { + commitment: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface Pool extends BaseContract { + connect(runner?: ContractRunner | null): Pool; + waitForDeployment(): Promise; + + interface: PoolInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + INIT_CODE_HASH: TypedContractMethod<[], [string], "view">; + + ROOT_HISTORY_SIZE: TypedContractMethod<[], [bigint], "view">; + + ZERO_COMMITMENT: TypedContractMethod<[], [bigint], "view">; + + ZERO_NULLIFIER: TypedContractMethod<[], [bigint], "view">; + + ZERO_ROOT: TypedContractMethod<[], [bigint], "view">; + + collect: TypedContractMethod< + [ + token: AddressLike, + balance: BigNumberish, + salt: BigNumberish, + stealthAddressOwnershipZkProof: BytesLike, + noteCommitment: BigNumberish, + noteCreationZkProof: BytesLike + ], + [void], + "nonpayable" + >; + + compute: TypedContractMethod<[salt: BigNumberish], [string], "view">; + + currentRootIndex: TypedContractMethod<[], [bigint], "view">; + + deposit: TypedContractMethod< + [amount: BigNumberish, noteCommitment: BigNumberish, proof: BytesLike], + [void], + "nonpayable" + >; + + filledSubtrees: TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + + getLastRoot: TypedContractMethod<[], [bigint], "view">; + + hash2Verifier: TypedContractMethod<[], [string], "view">; + + isKnownRoot: TypedContractMethod<[root: BigNumberish], [boolean], "view">; + + isNoteSpent: TypedContractMethod< + [nullifier: BigNumberish], + [boolean], + "view" + >; + + levels: TypedContractMethod<[], [bigint], "view">; + + nextIndex: TypedContractMethod<[], [bigint], "view">; + + noteCommitments: TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + + noteVerifier: TypedContractMethod<[], [string], "view">; + + roots: TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + + splitJoinVerifier: TypedContractMethod<[], [string], "view">; + + transact: TypedContractMethod< + [proof: BytesLike, publicInputs: BigNumberish[]], + [void], + "nonpayable" + >; + + usdc: TypedContractMethod<[], [string], "view">; + + zeros: TypedContractMethod<[i: BigNumberish], [bigint], "view">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "INIT_CODE_HASH" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "ROOT_HISTORY_SIZE" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "ZERO_COMMITMENT" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "ZERO_NULLIFIER" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "ZERO_ROOT" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "collect" + ): TypedContractMethod< + [ + token: AddressLike, + balance: BigNumberish, + salt: BigNumberish, + stealthAddressOwnershipZkProof: BytesLike, + noteCommitment: BigNumberish, + noteCreationZkProof: BytesLike + ], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "compute" + ): TypedContractMethod<[salt: BigNumberish], [string], "view">; + getFunction( + nameOrSignature: "currentRootIndex" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "deposit" + ): TypedContractMethod< + [amount: BigNumberish, noteCommitment: BigNumberish, proof: BytesLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "filledSubtrees" + ): TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + getFunction( + nameOrSignature: "getLastRoot" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "hash2Verifier" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "isKnownRoot" + ): TypedContractMethod<[root: BigNumberish], [boolean], "view">; + getFunction( + nameOrSignature: "isNoteSpent" + ): TypedContractMethod<[nullifier: BigNumberish], [boolean], "view">; + getFunction( + nameOrSignature: "levels" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "nextIndex" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "noteCommitments" + ): TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + getFunction( + nameOrSignature: "noteVerifier" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "roots" + ): TypedContractMethod<[arg0: BigNumberish], [bigint], "view">; + getFunction( + nameOrSignature: "splitJoinVerifier" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "transact" + ): TypedContractMethod< + [proof: BytesLike, publicInputs: BigNumberish[]], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "usdc" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "zeros" + ): TypedContractMethod<[i: BigNumberish], [bigint], "view">; + + getEvent( + key: "NewCommitment" + ): TypedContractEvent< + NewCommitmentEvent.InputTuple, + NewCommitmentEvent.OutputTuple, + NewCommitmentEvent.OutputObject + >; + getEvent( + key: "NullifierSpent" + ): TypedContractEvent< + NullifierSpentEvent.InputTuple, + NullifierSpentEvent.OutputTuple, + NullifierSpentEvent.OutputObject + >; + + filters: { + "NewCommitment(uint256)": TypedContractEvent< + NewCommitmentEvent.InputTuple, + NewCommitmentEvent.OutputTuple, + NewCommitmentEvent.OutputObject + >; + NewCommitment: TypedContractEvent< + NewCommitmentEvent.InputTuple, + NewCommitmentEvent.OutputTuple, + NewCommitmentEvent.OutputObject + >; + + "NullifierSpent(uint256)": TypedContractEvent< + NullifierSpentEvent.InputTuple, + NullifierSpentEvent.OutputTuple, + NullifierSpentEvent.OutputObject + >; + NullifierSpent: TypedContractEvent< + NullifierSpentEvent.InputTuple, + NullifierSpentEvent.OutputTuple, + NullifierSpentEvent.OutputObject + >; + }; +} diff --git a/src/contracts/typechain-types/contracts/StealthAddress.ts b/src/contracts/typechain-types/contracts/StealthAddress.ts new file mode 100644 index 0000000..13a6fd5 --- /dev/null +++ b/src/contracts/typechain-types/contracts/StealthAddress.ts @@ -0,0 +1,127 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../common"; + +export interface StealthAddressInterface extends Interface { + getFunction( + nameOrSignature: "call" | "pool" | "transferErc20" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "call", + values: [AddressLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData(functionFragment: "pool", values?: undefined): string; + encodeFunctionData( + functionFragment: "transferErc20", + values: [AddressLike, AddressLike, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "call", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pool", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferErc20", + data: BytesLike + ): Result; +} + +export interface StealthAddress extends BaseContract { + connect(runner?: ContractRunner | null): StealthAddress; + waitForDeployment(): Promise; + + interface: StealthAddressInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + call: TypedContractMethod< + [dest: AddressLike, value: BigNumberish, data: BytesLike], + [[boolean, string] & { success: boolean; returndata: string }], + "nonpayable" + >; + + pool: TypedContractMethod<[], [string], "view">; + + transferErc20: TypedContractMethod< + [token: AddressLike, dest: AddressLike, amount: BigNumberish], + [boolean], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "call" + ): TypedContractMethod< + [dest: AddressLike, value: BigNumberish, data: BytesLike], + [[boolean, string] & { success: boolean; returndata: string }], + "nonpayable" + >; + getFunction( + nameOrSignature: "pool" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "transferErc20" + ): TypedContractMethod< + [token: AddressLike, dest: AddressLike, amount: BigNumberish], + [boolean], + "nonpayable" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/contracts/USDC.ts b/src/contracts/typechain-types/contracts/USDC.ts new file mode 100644 index 0000000..4bbc37a --- /dev/null +++ b/src/contracts/typechain-types/contracts/USDC.ts @@ -0,0 +1,286 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../common"; + +export interface USDCInterface extends Interface { + getFunction( + nameOrSignature: + | "allowance" + | "approve" + | "balanceOf" + | "decimals" + | "name" + | "symbol" + | "totalSupply" + | "transfer" + | "transferFrom" + ): FunctionFragment; + + getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment; + + encodeFunctionData( + functionFragment: "allowance", + values: [AddressLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [AddressLike] + ): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transfer", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [AddressLike, AddressLike, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; +} + +export namespace ApprovalEvent { + export type InputTuple = [ + owner: AddressLike, + spender: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [owner: string, spender: string, value: bigint]; + export interface OutputObject { + owner: string; + spender: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TransferEvent { + export type InputTuple = [ + from: AddressLike, + to: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [from: string, to: string, value: bigint]; + export interface OutputObject { + from: string; + to: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface USDC extends BaseContract { + connect(runner?: ContractRunner | null): USDC; + waitForDeployment(): Promise; + + interface: USDCInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + allowance: TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + + approve: TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">; + + decimals: TypedContractMethod<[], [bigint], "view">; + + name: TypedContractMethod<[], [string], "view">; + + symbol: TypedContractMethod<[], [string], "view">; + + totalSupply: TypedContractMethod<[], [bigint], "view">; + + transfer: TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + transferFrom: TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "allowance" + ): TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "approve" + ): TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "balanceOf" + ): TypedContractMethod<[account: AddressLike], [bigint], "view">; + getFunction( + nameOrSignature: "decimals" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "name" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "symbol" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "totalSupply" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "transfer" + ): TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + getFunction( + nameOrSignature: "transferFrom" + ): TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [boolean], + "nonpayable" + >; + + getEvent( + key: "Approval" + ): TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + getEvent( + key: "Transfer" + ): TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + + filters: { + "Approval(address,address,uint256)": TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + Approval: TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + + "Transfer(address,address,uint256)": TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + Transfer: TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + }; +} diff --git a/src/contracts/typechain-types/contracts/Verifier.sol/Hash2Verifier.ts b/src/contracts/typechain-types/contracts/Verifier.sol/Hash2Verifier.ts new file mode 100644 index 0000000..6d3840e --- /dev/null +++ b/src/contracts/typechain-types/contracts/Verifier.sol/Hash2Verifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../common"; + +export interface Hash2VerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface Hash2Verifier extends BaseContract { + connect(runner?: ContractRunner | null): Hash2Verifier; + waitForDeployment(): Promise; + + interface: Hash2VerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/contracts/Verifier.sol/NoteVerifier.ts b/src/contracts/typechain-types/contracts/Verifier.sol/NoteVerifier.ts new file mode 100644 index 0000000..a30a112 --- /dev/null +++ b/src/contracts/typechain-types/contracts/Verifier.sol/NoteVerifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../common"; + +export interface NoteVerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface NoteVerifier extends BaseContract { + connect(runner?: ContractRunner | null): NoteVerifier; + waitForDeployment(): Promise; + + interface: NoteVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin16Verifier.ts b/src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin16Verifier.ts new file mode 100644 index 0000000..20c5343 --- /dev/null +++ b/src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin16Verifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../common"; + +export interface SplitJoin16VerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface SplitJoin16Verifier extends BaseContract { + connect(runner?: ContractRunner | null): SplitJoin16Verifier; + waitForDeployment(): Promise; + + interface: SplitJoin16VerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin32Verifier.ts b/src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin32Verifier.ts new file mode 100644 index 0000000..c03269f --- /dev/null +++ b/src/contracts/typechain-types/contracts/Verifier.sol/SplitJoin32Verifier.ts @@ -0,0 +1,110 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../common"; + +export interface SplitJoin32VerifierInterface extends Interface { + getFunction( + nameOrSignature: "getVerificationKeyHash" | "verify" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getVerificationKeyHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "verify", + values: [BytesLike, BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "getVerificationKeyHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result; +} + +export interface SplitJoin32Verifier extends BaseContract { + connect(runner?: ContractRunner | null): SplitJoin32Verifier; + waitForDeployment(): Promise; + + interface: SplitJoin32VerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getVerificationKeyHash: TypedContractMethod<[], [string], "view">; + + verify: TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getVerificationKeyHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "verify" + ): TypedContractMethod< + [_proof: BytesLike, _publicInputs: BytesLike[]], + [boolean], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/contracts/Verifier.sol/index.ts b/src/contracts/typechain-types/contracts/Verifier.sol/index.ts new file mode 100644 index 0000000..b03ba73 --- /dev/null +++ b/src/contracts/typechain-types/contracts/Verifier.sol/index.ts @@ -0,0 +1,7 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { Hash2Verifier } from "./Hash2Verifier"; +export type { NoteVerifier } from "./NoteVerifier"; +export type { SplitJoin16Verifier } from "./SplitJoin16Verifier"; +export type { SplitJoin32Verifier } from "./SplitJoin32Verifier"; diff --git a/src/contracts/typechain-types/contracts/index.ts b/src/contracts/typechain-types/contracts/index.ts new file mode 100644 index 0000000..0a11a4d --- /dev/null +++ b/src/contracts/typechain-types/contracts/index.ts @@ -0,0 +1,11 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as verifierSol from "./Verifier.sol"; +export type { verifierSol }; +import type * as test from "./test"; +export type { test }; +export type { MerkleTreeWithHistory } from "./MerkleTreeWithHistory"; +export type { Pool } from "./Pool"; +export type { StealthAddress } from "./StealthAddress"; +export type { USDC } from "./USDC"; diff --git a/src/contracts/typechain-types/contracts/test/Poseidon2Test.ts b/src/contracts/typechain-types/contracts/test/Poseidon2Test.ts new file mode 100644 index 0000000..912bd04 --- /dev/null +++ b/src/contracts/typechain-types/contracts/test/Poseidon2Test.ts @@ -0,0 +1,139 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../common"; + +export interface Poseidon2TestInterface extends Interface { + getFunction( + nameOrSignature: "hash_1" | "hash_1_twice" | "hash_2" | "hash_3" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "hash_1", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "hash_1_twice", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "hash_2", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "hash_3", + values: [BigNumberish, BigNumberish, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "hash_1", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "hash_1_twice", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "hash_2", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hash_3", data: BytesLike): Result; +} + +export interface Poseidon2Test extends BaseContract { + connect(runner?: ContractRunner | null): Poseidon2Test; + waitForDeployment(): Promise; + + interface: Poseidon2TestInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + hash_1: TypedContractMethod<[m1: BigNumberish], [bigint], "view">; + + hash_1_twice: TypedContractMethod<[m1: BigNumberish], [bigint], "view">; + + hash_2: TypedContractMethod< + [m1: BigNumberish, m2: BigNumberish], + [bigint], + "view" + >; + + hash_3: TypedContractMethod< + [m1: BigNumberish, m2: BigNumberish, m3: BigNumberish], + [bigint], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "hash_1" + ): TypedContractMethod<[m1: BigNumberish], [bigint], "view">; + getFunction( + nameOrSignature: "hash_1_twice" + ): TypedContractMethod<[m1: BigNumberish], [bigint], "view">; + getFunction( + nameOrSignature: "hash_2" + ): TypedContractMethod< + [m1: BigNumberish, m2: BigNumberish], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "hash_3" + ): TypedContractMethod< + [m1: BigNumberish, m2: BigNumberish, m3: BigNumberish], + [bigint], + "view" + >; + + filters: {}; +} diff --git a/src/contracts/typechain-types/contracts/test/index.ts b/src/contracts/typechain-types/contracts/test/index.ts new file mode 100644 index 0000000..75a1a00 --- /dev/null +++ b/src/contracts/typechain-types/contracts/test/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { Poseidon2Test } from "./Poseidon2Test"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/index.ts new file mode 100644 index 0000000..e306527 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as interfaces from "./interfaces"; +export * as token from "./token"; +export * as utils from "./utils"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts new file mode 100644 index 0000000..0413f8c --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts @@ -0,0 +1,127 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC1155Errors, + IERC1155ErrorsInterface, +} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "ERC1155InsufficientBalance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "approver", + type: "address", + }, + ], + name: "ERC1155InvalidApprover", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "idsLength", + type: "uint256", + }, + { + internalType: "uint256", + name: "valuesLength", + type: "uint256", + }, + ], + name: "ERC1155InvalidArrayLength", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + ], + name: "ERC1155InvalidOperator", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "receiver", + type: "address", + }, + ], + name: "ERC1155InvalidReceiver", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "ERC1155InvalidSender", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "ERC1155MissingApprovalForAll", + type: "error", + }, +] as const; + +export class IERC1155Errors__factory { + static readonly abi = _abi; + static createInterface(): IERC1155ErrorsInterface { + return new Interface(_abi) as IERC1155ErrorsInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): IERC1155Errors { + return new Contract(address, _abi, runner) as unknown as IERC1155Errors; + } +} diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts new file mode 100644 index 0000000..695f3f0 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts @@ -0,0 +1,111 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC20Errors, + IERC20ErrorsInterface, +} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "allowance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "ERC20InsufficientAllowance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "ERC20InsufficientBalance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "approver", + type: "address", + }, + ], + name: "ERC20InvalidApprover", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "receiver", + type: "address", + }, + ], + name: "ERC20InvalidReceiver", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "ERC20InvalidSender", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "ERC20InvalidSpender", + type: "error", + }, +] as const; + +export class IERC20Errors__factory { + static readonly abi = _abi; + static createInterface(): IERC20ErrorsInterface { + return new Interface(_abi) as IERC20ErrorsInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): IERC20Errors { + return new Contract(address, _abi, runner) as unknown as IERC20Errors; + } +} diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts new file mode 100644 index 0000000..8615d4d --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts @@ -0,0 +1,128 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC721Errors, + IERC721ErrorsInterface, +} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "ERC721IncorrectOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "ERC721InsufficientApproval", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "approver", + type: "address", + }, + ], + name: "ERC721InvalidApprover", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + ], + name: "ERC721InvalidOperator", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "ERC721InvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "receiver", + type: "address", + }, + ], + name: "ERC721InvalidReceiver", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "ERC721InvalidSender", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "ERC721NonexistentToken", + type: "error", + }, +] as const; + +export class IERC721Errors__factory { + static readonly abi = _abi; + static createInterface(): IERC721ErrorsInterface { + return new Interface(_abi) as IERC721ErrorsInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): IERC721Errors { + return new Contract(address, _abi, runner) as unknown as IERC721Errors; + } +} diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts new file mode 100644 index 0000000..571330e --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { IERC1155Errors__factory } from "./IERC1155Errors__factory"; +export { IERC20Errors__factory } from "./IERC20Errors__factory"; +export { IERC721Errors__factory } from "./IERC721Errors__factory"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts new file mode 100644 index 0000000..82d047e --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as draftIerc6093Sol from "./draft-IERC6093.sol"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts new file mode 100644 index 0000000..5d8981a --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts @@ -0,0 +1,330 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + ERC20, + ERC20Interface, +} from "../../../../../@openzeppelin/contracts/token/ERC20/ERC20"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "allowance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "ERC20InsufficientAllowance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "ERC20InsufficientBalance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "approver", + type: "address", + }, + ], + name: "ERC20InvalidApprover", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "receiver", + type: "address", + }, + ], + name: "ERC20InvalidReceiver", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "ERC20InvalidSender", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "ERC20InvalidSpender", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class ERC20__factory { + static readonly abi = _abi; + static createInterface(): ERC20Interface { + return new Interface(_abi) as ERC20Interface; + } + static connect(address: string, runner?: ContractRunner | null): ERC20 { + return new Contract(address, _abi, runner) as unknown as ERC20; + } +} diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts new file mode 100644 index 0000000..6768448 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts @@ -0,0 +1,205 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC20, + IERC20Interface, +} from "../../../../../@openzeppelin/contracts/token/ERC20/IERC20"; + +const _abi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class IERC20__factory { + static readonly abi = _abi; + static createInterface(): IERC20Interface { + return new Interface(_abi) as IERC20Interface; + } + static connect(address: string, runner?: ContractRunner | null): IERC20 { + return new Contract(address, _abi, runner) as unknown as IERC20; + } +} diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts new file mode 100644 index 0000000..80abf96 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts @@ -0,0 +1,247 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC20Metadata, + IERC20MetadataInterface, +} from "../../../../../../@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata"; + +const _abi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class IERC20Metadata__factory { + static readonly abi = _abi; + static createInterface(): IERC20MetadataInterface { + return new Interface(_abi) as IERC20MetadataInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): IERC20Metadata { + return new Contract(address, _abi, runner) as unknown as IERC20Metadata; + } +} diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts new file mode 100644 index 0000000..b9477f8 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { IERC20Metadata__factory } from "./IERC20Metadata__factory"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts new file mode 100644 index 0000000..3523dc7 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as extensions from "./extensions"; +export { ERC20__factory } from "./ERC20__factory"; +export { IERC20__factory } from "./IERC20__factory"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/index.ts new file mode 100644 index 0000000..da1e061 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/token/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as erc20 from "./ERC20"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/Create2__factory.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/Create2__factory.ts new file mode 100644 index 0000000..c528bbd --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/Create2__factory.ts @@ -0,0 +1,90 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../common"; +import type { + Create2, + Create2Interface, +} from "../../../../@openzeppelin/contracts/utils/Create2"; + +const _abi = [ + { + inputs: [], + name: "Create2EmptyBytecode", + type: "error", + }, + { + inputs: [], + name: "Create2FailedDeployment", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "Create2InsufficientBalance", + type: "error", + }, +] as const; + +const _bytecode = + "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220239b0baf69dac7c074f3d8d39c7d6ef331400a7d9a505dfd1546b5211b68c5ca64736f6c63430008180033"; + +type Create2ConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: Create2ConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Create2__factory extends ContractFactory { + constructor(...args: Create2ConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + Create2 & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): Create2__factory { + return super.connect(runner) as Create2__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): Create2Interface { + return new Interface(_abi) as Create2Interface; + } + static connect(address: string, runner?: ContractRunner | null): Create2 { + return new Contract(address, _abi, runner) as unknown as Create2; + } +} diff --git a/src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/index.ts new file mode 100644 index 0000000..817e918 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/contracts/utils/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Create2__factory } from "./Create2__factory"; diff --git a/src/contracts/typechain-types/factories/@openzeppelin/index.ts b/src/contracts/typechain-types/factories/@openzeppelin/index.ts new file mode 100644 index 0000000..6397da0 --- /dev/null +++ b/src/contracts/typechain-types/factories/@openzeppelin/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as contracts from "./contracts"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts new file mode 100644 index 0000000..e0bd881 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as plonkVkSol from "./plonk_vk.sol"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier__factory.ts new file mode 100644 index 0000000..3aad723 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier__factory.ts @@ -0,0 +1,118 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + BaseUltraVerifier, + BaseUltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class BaseUltraVerifier__factory { + static readonly abi = _abi; + static createInterface(): BaseUltraVerifierInterface { + return new Interface(_abi) as BaseUltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): BaseUltraVerifier { + return new Contract(address, _abi, runner) as unknown as BaseUltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier__factory.ts new file mode 100644 index 0000000..593a984 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier__factory.ts @@ -0,0 +1,160 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../../../../../common"; +import type { + UltraVerifier, + UltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d81526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea2646970667358221220ec32f23acefb58261fe4390e7b88b4489b8101f239f06d6a811e8723545815f864736f6c63430008180033"; + +type UltraVerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: UltraVerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class UltraVerifier__factory extends ContractFactory { + constructor(...args: UltraVerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + UltraVerifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): UltraVerifier__factory { + return super.connect(runner) as UltraVerifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): UltraVerifierInterface { + return new Interface(_abi) as UltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): UltraVerifier { + return new Contract(address, _abi, runner) as unknown as UltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts new file mode 100644 index 0000000..22c64f0 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory"; +export { UltraVerifier__factory } from "./UltraVerifier__factory"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/index.ts new file mode 100644 index 0000000..8061129 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/contract/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as hash2 from "./hash_2"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/index.ts new file mode 100644 index 0000000..f2fa6e7 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/hash_2/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as contract from "./contract"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/index.ts new file mode 100644 index 0000000..fdc969c --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/index.ts @@ -0,0 +1,7 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as hash2 from "./hash_2"; +export * as note from "./note"; +export * as splitJoin16 from "./split_join_16"; +export * as splitJoin32 from "./split_join_32"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/index.ts new file mode 100644 index 0000000..59fee01 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as note from "./note"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/index.ts new file mode 100644 index 0000000..e0bd881 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as plonkVkSol from "./plonk_vk.sol"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier__factory.ts new file mode 100644 index 0000000..72b2193 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier__factory.ts @@ -0,0 +1,118 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + BaseUltraVerifier, + BaseUltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/BaseUltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class BaseUltraVerifier__factory { + static readonly abi = _abi; + static createInterface(): BaseUltraVerifierInterface { + return new Interface(_abi) as BaseUltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): BaseUltraVerifier { + return new Contract(address, _abi, runner) as unknown as BaseUltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier__factory.ts new file mode 100644 index 0000000..a3a90ba --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier__factory.ts @@ -0,0 +1,160 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../../../../../common"; +import type { + UltraVerifier, + UltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/UltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517fc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f296259081526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212200579157c3258950132c9f4aaf287ddb183b8cc0e115c830b691de548176e41c064736f6c63430008180033"; + +type UltraVerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: UltraVerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class UltraVerifier__factory extends ContractFactory { + constructor(...args: UltraVerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + UltraVerifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): UltraVerifier__factory { + return super.connect(runner) as UltraVerifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): UltraVerifierInterface { + return new Interface(_abi) as UltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): UltraVerifier { + return new Contract(address, _abi, runner) as unknown as UltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts new file mode 100644 index 0000000..22c64f0 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/contract/note/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory"; +export { UltraVerifier__factory } from "./UltraVerifier__factory"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/index.ts new file mode 100644 index 0000000..f2fa6e7 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/note/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as contract from "./contract"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/index.ts new file mode 100644 index 0000000..f4ebd6e --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as splitJoin16 from "./split_join_16"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts new file mode 100644 index 0000000..e0bd881 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as plonkVkSol from "./plonk_vk.sol"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier__factory.ts new file mode 100644 index 0000000..9cbf243 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier__factory.ts @@ -0,0 +1,118 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + BaseUltraVerifier, + BaseUltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/BaseUltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class BaseUltraVerifier__factory { + static readonly abi = _abi; + static createInterface(): BaseUltraVerifierInterface { + return new Interface(_abi) as BaseUltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): BaseUltraVerifier { + return new Contract(address, _abi, runner) as unknown as BaseUltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier__factory.ts new file mode 100644 index 0000000..d143ad5 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier__factory.ts @@ -0,0 +1,160 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../../../../../common"; +import type { + UltraVerifier, + UltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/UltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b506180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af457637e5769bf60e01b60005260046000fd5b5050612ceb80610b056000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed381526020015b60405180910390f35b61008161007c366004612bf0565b610091565b6040519015158152602001610065565b6180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300526103a0518281146108a0576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1b576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d15577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edb57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9c565b50505080610f0d577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f49578483840992508001610f34565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f80578483840992508001610f6b565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611076577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce7576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d21576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d82576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de3576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e47576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eaf576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f17576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7f576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe7576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204f576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b7576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128af577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e5576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612943576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa45761340051613420518582830986600388838609088783840914612a00576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4e576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad4577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be2577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0657600080fd5b843567ffffffffffffffff80821115612c1e57600080fd5b818701915087601f830112612c3257600080fd5b813581811115612c4157600080fd5b886020828501011115612c5357600080fd5b602092830196509450908601359080821115612c6e57600080fd5b818701915087601f830112612c8257600080fd5b813581811115612c9157600080fd5b8860208260051b8501011115612ca657600080fd5b9598949750506020019450505056fea26469706673582212204116754a033bbced42a5ef72bce4ad80514907745290761b084aeecbcbdc9b8364736f6c63430008180033"; + +type UltraVerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: UltraVerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class UltraVerifier__factory extends ContractFactory { + constructor(...args: UltraVerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + UltraVerifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): UltraVerifier__factory { + return super.connect(runner) as UltraVerifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): UltraVerifierInterface { + return new Interface(_abi) as UltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): UltraVerifier { + return new Contract(address, _abi, runner) as unknown as UltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts new file mode 100644 index 0000000..22c64f0 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/contract/split_join_16/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory"; +export { UltraVerifier__factory } from "./UltraVerifier__factory"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/index.ts new file mode 100644 index 0000000..f2fa6e7 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_16/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as contract from "./contract"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/index.ts new file mode 100644 index 0000000..415e778 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as splitJoin32 from "./split_join_32"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts new file mode 100644 index 0000000..e0bd881 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as plonkVkSol from "./plonk_vk.sol"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier__factory.ts new file mode 100644 index 0000000..d6ae135 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier__factory.ts @@ -0,0 +1,118 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + BaseUltraVerifier, + BaseUltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/BaseUltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class BaseUltraVerifier__factory { + static readonly abi = _abi; + static createInterface(): BaseUltraVerifierInterface { + return new Interface(_abi) as BaseUltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): BaseUltraVerifier { + return new Contract(address, _abi, runner) as unknown as BaseUltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier__factory.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier__factory.ts new file mode 100644 index 0000000..a7faa7c --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier__factory.ts @@ -0,0 +1,160 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../../../../../common"; +import type { + UltraVerifier, + UltraVerifierInterface, +} from "../../../../../../../../@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/UltraVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b50620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af257637e5769bf60e01b60005260046000fd5b5050612ce980610b036000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c207404556581526020015b60405180910390f35b61008161007c366004612bee565b610091565b6040519015158152602001610065565b620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300526103a05182811461089e576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d19576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d13577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ed957823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9a565b50505080610f0b577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f47578483840992508001610f32565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7e578483840992508001610f69565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611074577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce5576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d1f576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d80576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de1576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e45576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611ead576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f15576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7d576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe5576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204d576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b5576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ad577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e3576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612941576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa257613400516134205185828309866003888386090887838409146129fe576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4c576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad2577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be0577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0457600080fd5b843567ffffffffffffffff80821115612c1c57600080fd5b818701915087601f830112612c3057600080fd5b813581811115612c3f57600080fd5b886020828501011115612c5157600080fd5b602092830196509450908601359080821115612c6c57600080fd5b818701915087601f830112612c8057600080fd5b813581811115612c8f57600080fd5b8860208260051b8501011115612ca457600080fd5b9598949750506020019450505056fea2646970667358221220b3ae0708d7a8e1f69d8b17814f51766c8aa9e32f163a840ef3e749d7b36d156e64736f6c63430008180033"; + +type UltraVerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: UltraVerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class UltraVerifier__factory extends ContractFactory { + constructor(...args: UltraVerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + UltraVerifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): UltraVerifier__factory { + return super.connect(runner) as UltraVerifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): UltraVerifierInterface { + return new Interface(_abi) as UltraVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): UltraVerifier { + return new Contract(address, _abi, runner) as unknown as UltraVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts new file mode 100644 index 0000000..22c64f0 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/contract/split_join_32/plonk_vk.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory"; +export { UltraVerifier__factory } from "./UltraVerifier__factory"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/index.ts new file mode 100644 index 0000000..f2fa6e7 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/bin/split_join_32/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as contract from "./contract"; diff --git a/src/contracts/typechain-types/factories/@ultralane/circuits/index.ts b/src/contracts/typechain-types/factories/@ultralane/circuits/index.ts new file mode 100644 index 0000000..0a96007 --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/circuits/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as bin from "./bin"; diff --git a/src/contracts/typechain-types/factories/@ultralane/index.ts b/src/contracts/typechain-types/factories/@ultralane/index.ts new file mode 100644 index 0000000..6c4ca6b --- /dev/null +++ b/src/contracts/typechain-types/factories/@ultralane/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as circuits from "./circuits"; diff --git a/src/contracts/typechain-types/factories/contracts/Lock__factory.ts b/src/contracts/typechain-types/factories/contracts/Lock__factory.ts new file mode 100644 index 0000000..f8c186d --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/Lock__factory.ts @@ -0,0 +1,133 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { + Signer, + BigNumberish, + ContractDeployTransaction, + ContractRunner, +} from "ethers"; +import type { PayableOverrides } from "../../common"; +import type { Lock, LockInterface } from "../../contracts/Lock"; + +const _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_unlockTime", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "when", + type: "uint256", + }, + ], + name: "Withdrawal", + type: "event", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unlockTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405260405161031d38038061031d8339810160408190526100229161009b565b8042106100815760405162461bcd60e51b815260206004820152602360248201527f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460448201526275726560e81b606482015260840160405180910390fd5b600055600180546001600160a01b031916331790556100b4565b6000602082840312156100ad57600080fd5b5051919050565b61025a806100c36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100625780638da5cb5b1461006c575b600080fd5b61004f60005481565b6040519081526020015b60405180910390f35b61006a6100b1565b005b60015461008c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610059565b600054421015610122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f596f752063616e2774207769746864726177207965740000000000000000000060448201526064015b60405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff1633146101a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f596f75206172656e277420746865206f776e65720000000000000000000000006044820152606401610119565b604080514781524260208201527fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b93910160405180910390a160015460405173ffffffffffffffffffffffffffffffffffffffff909116904780156108fc02916000818181858888f19350505050158015610221573d6000803e3d6000fd5b5056fea264697066735822122098bc3664d60bd07924c0e1c6fa5d283eb2ef54c7aa7ff6dc5db4d4d7d5dc446764736f6c63430008180033"; + +type LockConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: LockConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Lock__factory extends ContractFactory { + constructor(...args: LockConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + _unlockTime: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(_unlockTime, overrides || {}); + } + override deploy( + _unlockTime: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ) { + return super.deploy(_unlockTime, overrides || {}) as Promise< + Lock & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): Lock__factory { + return super.connect(runner) as Lock__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): LockInterface { + return new Interface(_abi) as LockInterface; + } + static connect(address: string, runner?: ContractRunner | null): Lock { + return new Contract(address, _abi, runner) as unknown as Lock; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/MerkleTreeWithHistory__factory.ts b/src/contracts/typechain-types/factories/contracts/MerkleTreeWithHistory__factory.ts new file mode 100644 index 0000000..c5c9f5d --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/MerkleTreeWithHistory__factory.ts @@ -0,0 +1,234 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { + Signer, + BigNumberish, + ContractDeployTransaction, + ContractRunner, +} from "ethers"; +import type { NonPayableOverrides } from "../../common"; +import type { + MerkleTreeWithHistory, + MerkleTreeWithHistoryInterface, +} from "../../contracts/MerkleTreeWithHistory"; + +const _abi = [ + { + inputs: [ + { + internalType: "uint32", + name: "_levels", + type: "uint32", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "ROOT_HISTORY_SIZE", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "currentRootIndex", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "filledSubtrees", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getLastRoot", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "Field", + name: "root", + type: "uint256", + }, + ], + name: "isKnownRoot", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "levels", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nextIndex", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "roots", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "i", + type: "uint256", + }, + ], + name: "zeros", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, +] as const; + +const _bytecode = + "0x6080604052600380546001600160401b03191690553480156200002157600080fd5b50604051620011c4380380620011c483398101604081905262000044916200081a565b60008163ffffffff1611620000ac5760405162461bcd60e51b815260206004820152602360248201527f5f6c6576656c732073686f756c642062652067726561746572207468616e207a60448201526265726f60e81b60648201526084015b60405180910390fd5b60208163ffffffff1611156200010f5760405162461bcd60e51b815260206004820152602160248201527f5f6c6576656c732073686f756c64206265206c657373207468616e20657120336044820152601960f91b6064820152608401620000a3565b6000805463ffffffff191663ffffffff83161781555b8163ffffffff168163ffffffff1610156200016e576200014b63ffffffff8216620001be565b63ffffffff82166000908152600160208190526040909120919091550162000125565b506200018c6200018060018362000849565b63ffffffff16620001be565b6000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55506200087c565b600081600003620001d157506000919050565b816001036200020157507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b816002036200023157507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b816003036200026157507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b816004036200029157507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503620002c157507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b81600603620002f157507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b816007036200032157507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b816008036200035157507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b816009036200038157507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03620003b157507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b03620003e157507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c036200041157507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d036200044157507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e036200047157507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f03620004a157507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b81601003620004d157507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036200050157507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036200053157507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b816013036200056157507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b816014036200059157507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b81601503620005c157507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b81601603620005f157507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036200062157507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b816018036200065157507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b816019036200068157507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a03620006b157507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b03620006e157507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036200071157507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036200074157507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e036200077157507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f03620007a157507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b81602003620007d157507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401620000a3565b6000602082840312156200082d57600080fd5b815163ffffffff811681146200084257600080fd5b9392505050565b63ffffffff8281168282160390808211156200087557634e487b7160e01b600052601160045260246000fd5b5092915050565b610938806200088c6000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063c2b40ae411610076578063e82955881161005b578063e829558814610154578063f178e47c14610167578063fc7e9c6f1461018757600080fd5b8063c2b40ae41461012c578063cd87a3b41461014c57600080fd5b80634ecf518b146100a857806390eeb02b146100d2578063a6232a93146100e2578063ba70f75714610105575b600080fd5b6000546100b89063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b6003546100b89063ffffffff1681565b6100f56100f0366004610884565b61019f565b60405190151581526020016100c9565b60035463ffffffff166000908152600260205260409020545b6040519081526020016100c9565b61011e61013a366004610884565b60026020526000908152604090205481565b6100b8601e81565b61011e610162366004610884565b610228565b61011e610175366004610884565b60016020526000908152604090205481565b6003546100b890640100000000900463ffffffff1681565b6000816101ae57506000919050565b60035463ffffffff16805b63ffffffff8082166000908152600260205260409020546101dd9186919061088016565b156101ec575060019392505050565b8063ffffffff166000036101fe5750601e5b806102088161089d565b9150508163ffffffff168163ffffffff16036101b9575060009392505050565b60008160000361023a57506000919050565b8160010361026957507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b8160020361029857507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b816003036102c757507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b816004036102f657507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b8160050361032557507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b8160060361035457507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b8160070361038357507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b816008036103b257507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b816009036103e157507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a0361041057507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b0361043f57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c0361046e57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d0361049d57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e036104cc57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f036104fb57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b8160100361052a57507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b8160110361055957507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b8160120361058857507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b816013036105b757507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b816014036105e657507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b8160150361061557507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b8160160361064457507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b8160170361067357507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b816018036106a257507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b816019036106d157507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a0361070057507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b0361072f57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c0361075e57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d0361078d57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e036107bc57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f036107eb57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b8160200361081a57507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e646578206f7574206f6620626f756e647300000000000000000000000000604482015260640160405180910390fd5b1490565b60006020828403121561089657600080fd5b5035919050565b600063ffffffff8216806108da577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019291505056fea2646970667358221220c75fb6d837c193a986e699fbfc5061f06facf31d5e922b0dff5b881fe968282764736f6c63430008180033"; + +type MerkleTreeWithHistoryConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MerkleTreeWithHistoryConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class MerkleTreeWithHistory__factory extends ContractFactory { + constructor(...args: MerkleTreeWithHistoryConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + _levels: BigNumberish, + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(_levels, overrides || {}); + } + override deploy( + _levels: BigNumberish, + overrides?: NonPayableOverrides & { from?: string } + ) { + return super.deploy(_levels, overrides || {}) as Promise< + MerkleTreeWithHistory & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect( + runner: ContractRunner | null + ): MerkleTreeWithHistory__factory { + return super.connect(runner) as MerkleTreeWithHistory__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MerkleTreeWithHistoryInterface { + return new Interface(_abi) as MerkleTreeWithHistoryInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): MerkleTreeWithHistory { + return new Contract( + address, + _abi, + runner + ) as unknown as MerkleTreeWithHistory; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/Pool__factory.ts b/src/contracts/typechain-types/factories/contracts/Pool__factory.ts new file mode 100644 index 0000000..de1fe61 --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/Pool__factory.ts @@ -0,0 +1,521 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { + Signer, + AddressLike, + ContractDeployTransaction, + ContractRunner, +} from "ethers"; +import type { NonPayableOverrides } from "../../common"; +import type { Pool, PoolInterface } from "../../contracts/Pool"; + +const _abi = [ + { + inputs: [ + { + internalType: "contract SplitJoin16Verifier", + name: "_splitJoinVerifier", + type: "address", + }, + { + internalType: "contract Hash2Verifier", + name: "_hash2Verifier", + type: "address", + }, + { + internalType: "contract NoteVerifier", + name: "_noteVerifier", + type: "address", + }, + { + internalType: "contract IERC20", + name: "_usdc", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "Field", + name: "commitment", + type: "uint256", + }, + ], + name: "NewCommitment", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "Field", + name: "commitment", + type: "uint256", + }, + ], + name: "NullifierSpent", + type: "event", + }, + { + inputs: [], + name: "INIT_CODE_HASH", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ROOT_HISTORY_SIZE", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ZERO_COMMITMENT", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ZERO_NULLIFIER", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ZERO_ROOT", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + { + internalType: "Field", + name: "salt", + type: "uint256", + }, + { + internalType: "bytes", + name: "stealthAddressOwnershipZkProof", + type: "bytes", + }, + { + internalType: "Field", + name: "noteCommitment", + type: "uint256", + }, + { + internalType: "bytes", + name: "noteCreationZkProof", + type: "bytes", + }, + ], + name: "collect", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "Field", + name: "salt", + type: "uint256", + }, + ], + name: "compute", + outputs: [ + { + internalType: "address", + name: "stealthAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "currentRootIndex", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "Field", + name: "noteCommitment", + type: "uint256", + }, + { + internalType: "bytes", + name: "proof", + type: "bytes", + }, + ], + name: "deposit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "filledSubtrees", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getLastRoot", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "hash2Verifier", + outputs: [ + { + internalType: "contract Hash2Verifier", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "Field", + name: "root", + type: "uint256", + }, + ], + name: "isKnownRoot", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "Field", + name: "nullifier", + type: "uint256", + }, + ], + name: "isNoteSpent", + outputs: [ + { + internalType: "bool", + name: "isSpent", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "levels", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nextIndex", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "noteCommitments", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "noteVerifier", + outputs: [ + { + internalType: "contract NoteVerifier", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "roots", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "splitJoinVerifier", + outputs: [ + { + internalType: "contract SplitJoin16Verifier", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "proof", + type: "bytes", + }, + { + internalType: "Field[]", + name: "publicInputs", + type: "uint256[]", + }, + ], + name: "transact", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "usdc", + outputs: [ + { + internalType: "contract IERC20", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "i", + type: "uint256", + }, + ], + name: "zeros", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, +] as const; + +const _bytecode = + "0x6080604052600380546001600160401b03191690553480156200002157600080fd5b50604051620073f5380380620073f5833981016040819052620000449162002b54565b601062000055565b60405180910390fd5b60208163ffffffff161115620000b85760405162461bcd60e51b815260206004820152602160248201527f5f6c6576656c732073686f756c64206265206c657373207468616e20657120336044820152601960f91b60648201526084016200004c565b6000805463ffffffff191663ffffffff83161781555b8163ffffffff168163ffffffff1610156200011757620000f463ffffffff8216620001f9565b63ffffffff821660009081526001602081905260409091209190915501620000ce565b50620001356200012960018362002bd2565b63ffffffff16620001f9565b6000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5550600480546001600160a01b038087166001600160a01b03199283161790925560058054868416908316179055600680548584169216919091179055600380549183166801000000000000000002600160401b600160e01b0319909216919091179055620001ee7f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a62000855565b505050505062002e14565b6000816000036200020c57506000919050565b816001036200023c57507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b816002036200026c57507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b816003036200029c57507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403620002cc57507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503620002fc57507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b816006036200032c57507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b816007036200035c57507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b816008036200038c57507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903620003bc57507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03620003ec57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b036200041c57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c036200044c57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d036200047c57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e03620004ac57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f03620004dc57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b816010036200050c57507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036200053c57507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036200056c57507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b816013036200059c57507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b81601403620005cc57507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b81601503620005fc57507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036200062c57507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036200065c57507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b816018036200068c57507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b81601903620006bc57507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a03620006ec57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b036200071c57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036200074c57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036200077c57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e03620007ac57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f03620007dc57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b816020036200080c57507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016200004c565b60035460008054909163ffffffff6401000000009091048116916200087d9116600262002d22565b63ffffffff168163ffffffff1603620008f25760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201526f1d995cc818d85b88189948185919195960821b60648201526084016200004c565b8083600080805b60005463ffffffff90811690821610156200099f576200091b60028662002d4f565b63ffffffff166000036200095d578392506200093d63ffffffff8216620001f9565b63ffffffff82166000908152600160205260409020859055915062000979565b63ffffffff811660009081526001602052604090205492508391505b62000985838362000a32565b93506200099460028662002d75565b9450600101620008f9565b50600354600090601e90620009bc9063ffffffff16600162002d9b565b620009c8919062002d4f565b6003805463ffffffff191663ffffffff83169081179091556000908152600260205260409020859055905062000a0086600162002d9b565b6003805463ffffffff929092166401000000000263ffffffff60201b1990921691909117905550939695505050505050565b60408051600280825260608201835260009283929190602083019080368337019050509050838160008151811062000a6e5762000a6e62002dbb565b602002602001018181525050828160018151811062000a915762000a9162002dbb565b602090810291909101015262000ab562000aaa62000abf565b8260026000620020b1565b9150505b92915050565b62000ac962002a5d565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b600080620020d1620020ca86516200214d60201b60201c565b8762002153565b905060005b85518110156200212357848110156200211a576200211a86828151811062002102576200210262002dbb565b602002602001015183620021fa60201b90919060201c565b600101620020d6565b508215620021385762002138816001620021fa565b6200214381620022b8565b9695505050505050565b60401b90565b6200215d62002a86565b60006040518060c00160405280858152602001604051806060016040528060008152602001600081526020016000815250815260200160405180608001604052806000815260200160008152602001600081526020016000815250815260200160008152602001600015158152602001848152509050838160400151600360048110620021ee57620021ee62002dbb565b60200201529392505050565b816080015115801562002211575060038260600151145b156200223357620022228262002414565b506020820151526001606090910152565b81608001511580156200224b57506003826060015114155b1562002292578082602001518360600151600381106200226f576200226f62002dbb565b6020020152606082018051600191906200228b90839062002dd1565b9052505050565b816080015115620022b457602082015181905260016060830152600060808301525b5050565b600081608001518015620022ce57506060820151155b15620022e35760006080830181905260608301525b81608001516200235b576000620022fa8362002414565b60016080850152905060005b6003811015620023515781816003811062002325576200232562002dbb565b60200201518460200151826003811062002343576200234362002dbb565b602002015260010162002306565b5050600360608301525b60208201515160015b6003811015620023cf578360600151811015620023c6578360200151816003811062002394576200239462002dbb565b60200201518460200151600183620023ad919062002de7565b60038110620023c057620023c062002dbb565b60200201525b60010162002364565b50600183606001818151620023e5919062002de7565b90525060208301516060840151600091906003811062002409576200240962002dbb565b602002015292915050565b6200241e62002ace565b60005b6003811015620024615782606001518110620024585760008360200151826003811062002452576200245262002dbb565b60200201525b60010162002421565b5060005b6003811015620024dd57620024b6836020015182600381106200248c576200248c62002dbb565b602002015184604001518360048110620024aa57620024aa62002dbb565b60200201519062002574565b83604001518260048110620024cf57620024cf62002dbb565b602002015260010162002465565b50604082015160a08301518051602090910151620024fd929190620025a1565b6040808401919091528051606081018252600080825260208201819052918101829052905b60038110156200256d578360400151816004811062002545576200254562002dbb565b60200201518282600381106200255f576200255f62002dbb565b602002015260010162002522565b5092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b620025ab62002aec565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156200261e57858160048110620025f657620025f662002dbb565b602002015182826004811062002610576200261062002dbb565b6020020152600101620025d7565b506200262a816200273c565b60006200263a6002600862002dfd565b905060005b8181101562002674576200265583868362002852565b6200266083620028d4565b6200266b836200273c565b6001016200263f565b5060006200268460388362002dd1565b9050815b81811015620026e557620026b9868260408110620026aa57620026aa62002dbb565b602002015151856000620024aa565b8452620026ce8460005b60200201516200291d565b8452620026dc84886200294d565b60010162002688565b506000620026f66038600862002dd1565b9050815b818110156200272f576200271085888362002852565b6200271b85620028d4565b62002726856200273c565b600101620026fa565b5092979650505050505050565b6000620027538260016020020151836000620024aa565b905060006200276c8360036020020151846002620024aa565b90506000620027858460016020020151856001620024aa565b905062002793818362002574565b90506000620027ac8560036020020151866003620024aa565b9050620027ba818562002574565b90506000620027ca848062002574565b9050620027d8818062002574565b9050620027e6818362002574565b90506000620027f6868062002574565b905062002804818062002574565b905062002812818562002574565b9050600062002822848362002574565b9050600062002832868562002574565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015620028ce57620028ab83836040811062002878576200287862002dbb565b6020020151826004811062002891576200289162002dbb565b6020020151858360048110620024aa57620024aa62002dbb565b848260048110620028c057620028c062002dbb565b602002015260010162002855565b50505050565b60005b6004811015620022b457620028fa828260048110620026c357620026c362002dbb565b8282600481106200290f576200290f62002dbb565b6020020152600101620028d7565b6000806200292c838062002a30565b905062002946836200293f838062002a30565b9062002a30565b9392505050565b6000805b60048110156200298c576200298184826004811062002974576200297462002dbb565b6020020151839062002574565b915060010162002951565b5060005b6004811015620028ce57620029d9838260048110620029b357620029b362002dbb565b6020020151858360048110620029cd57620029cd62002dbb565b60200201519062002a30565b848260048110620029ee57620029ee62002dbb565b602002015262002a0d82858360048110620024aa57620024aa62002dbb565b84826004811062002a225762002a2262002dbb565b602002015260010162002990565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b604051806040016040528062002a7262002aec565b815260200162002a8162002b0a565b905290565b6040518060c001604052806000815260200162002aa262002ace565b815260200162002ab162002aec565b8152600060208201819052604082015260600162002a8162002a5d565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b62002b2462002aec565b81526020019060019003908162002b1a5790505090565b6001600160a01b038116811462002b5157600080fd5b50565b6000806000806080858703121562002b6b57600080fd5b845162002b788162002b3b565b602086015190945062002b8b8162002b3b565b604086015190935062002b9e8162002b3b565b606086015190925062002bb18162002b3b565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8281168282160390808211156200256d576200256d62002bbc565b600181815b8085111562002c35578163ffffffff0482111562002c195762002c1962002bbc565b8085161562002c2757918102915b93841c939080029062002bf7565b509250929050565b60008262002c4e5750600162000ab9565b8162002c5d5750600062000ab9565b816001811462002c76576002811462002c815762002cb9565b600191505062000ab9565b60ff84111562002c955762002c9562002bbc565b6001841b915063ffffffff82111562002cb25762002cb262002bbc565b5062000ab9565b5060208310610133831016604e8410600b841016171562002cf5575081810a63ffffffff81111562002cef5762002cef62002bbc565b62000ab9565b62002d01838362002bf2565b8063ffffffff0482111562002d1a5762002d1a62002bbc565b029392505050565b600063ffffffff62000ab581851682851662002c3d565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168062002d695762002d6962002d39565b92169190910692915050565b600063ffffffff8084168062002d8f5762002d8f62002d39565b92169190910492915050565b63ffffffff8181168382160190808211156200256d576200256d62002bbc565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000ab95762000ab962002bbc565b8181038181111562000ab95762000ab962002bbc565b60008262002e0f5762002e0f62002d39565b500490565b6145d18062002e246000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806390eeb02b116100e3578063c2b40ae41161008c578063e829558811610066578063e8295588146103f4578063f178e47c14610407578063fc7e9c6f1461042757600080fd5b8063c2b40ae4146103ac578063cd87a3b4146103cc578063e40af72e146103d457600080fd5b8063a6232a93116100bd578063a6232a9314610369578063aa0b7db71461037c578063ba70f7571461038f57600080fd5b806390eeb02b1461033157806395d1d7c71461034157806398754e0a1461035657600080fd5b8063404c8149116101455780634ecf518b1161011f5780634ecf518b146102c65780635ed86d5c146102eb578063738133dc146102fe57600080fd5b8063404c8149146102655780634b8ecb0e146102785780634c5eb6761461029f57600080fd5b806329648a971161017657806329648a97146101f257806329a2b3cf146102195780633e413bee1461023957600080fd5b80631202471514610192578063257671f5146101dc575b600080fd5b6004546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101e461043f565b6040519081526020016101d3565b6101e47f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb281565b6006546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6003546101b29068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610273366004613a80565b61046c565b6101e47f087486f7f14f265e263a4a6e776d45c15664d2dcb8c72288f4acf7fe1daeedaf81565b6101e47f0ecc1f56d6a29051a511ea4b08361649d190b7f7525a9d4ed36b9041e127207a81565b6000546102d69063ffffffff1681565b60405163ffffffff90911681526020016101d3565b6101b26102f9366004613a80565b61048d565b61032161030c366004613a80565b60076020526000908152604090205460ff1681565b60405190151581526020016101d3565b6003546102d69063ffffffff1681565b61035461034f366004613b69565b6104c8565b005b610354610364366004613c14565b610662565b610321610377366004613a80565b610cee565b61035461038a366004613cde565b610d77565b60035463ffffffff166000908152600260205260409020546101e4565b6101e46103ba366004613a80565b60026020526000908152604090205481565b6102d6601e81565b6005546101b29073ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610402366004613a80565b610d87565b6101e4610415366004613a80565b60016020526000908152604090205481565b6003546102d690640100000000900463ffffffff1681565b60405161044e602082016139a2565b6020820181038252601f19601f820116604052508051906020012081565b6008818154811061047c57600080fd5b600091825260209091200154905081565b60006104c2826040516104a2602082016139a2565b6020820181038252601f19601f82011660405250805190602001206113c6565b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e4846104f0876113da565b6040518363ffffffff1660e01b815260040161050d929190613d2e565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e9190613dc6565b61059f5760405162461bcd60e51b815260206004820152601560248201527f6861736832207a6b2070726f6f66206661696c6564000000000000000000000060448201526064015b60405180910390fd5b60006105aa85611421565b6040517f02cba74100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015230602483015260448201899052919250908216906302cba741906064016020604051808303816000875af1158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190613dc6565b50610659868484611589565b50505050505050565b6106858160008151811061067857610678613de8565b6020026020010151610cee565b6106d15760405162461bcd60e51b815260206004820152601560248201527f4465706f7369747320726f6f7420756e6b6e6f776e00000000000000000000006044820152606401610596565b6000806106f7836001815181106106ea576106ea613de8565b60200260200101516116f9565b915091506107487f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460038151811061073257610732613de8565b602002602001015161176690919063ffffffff16565b61086857600760008460038151811061076357610763613de8565b60209081029190910181015182528101919091526040016000205460ff16156107ce5760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b600160076000856003815181106107e7576107e7613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360038151811061084857610848613de8565b602002602001015160405161085f91815260200190565b60405180910390a15b61089f7f262540451c6dd240fa72641be24bca61b14a3e5101df5633ef8d4f9e669eddb28460048151811061073257610732613de8565b6109bf5760076000846004815181106108ba576108ba613de8565b60209081029190910181015182528101919091526040016000205460ff16156109255760405162461bcd60e51b815260206004820152600d60248201527f4e6f7465206973207370656e74000000000000000000000000000000000000006044820152606401610596565b6001600760008560048151811061093e5761093e613de8565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb7517d93585257c6e03d2d3d0126dfb8f9290e9bd3e8d2582f2977bd85c5dbe98360048151811061099f5761099f613de8565b60200260200101516040516109b691815260200190565b60405180910390a15b60045473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e485856040518363ffffffff1660e01b81526004016109fc929190613d2e565b602060405180830381865afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613dc6565b610a895760405162461bcd60e51b815260206004820152601a60248201527f73706c6974206a6f696e207a6b2070726f6f66206661696c65640000000000006044820152606401610596565b7ff234da3258dbf8e5a4e39e1acffc5d2bedbd437738faf277c46c20c6556a0b2e83600481518110610abd57610abd613de8565b6020026020010151604051610ad491815260200190565b60405180910390a1600883600481518110610af157610af1613de8565b602090810291909101810151825460018101845560009384529190922001558251610b369084906004908110610b2957610b29613de8565b602002602001015161176a565b508115610bef576003546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af1158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613dc6565b50610ce8565b600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c5085600281518110610c4357610c43613de8565b6020026020010151611971565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190613dc6565b505b50505050565b600081610cfd57506000919050565b60035463ffffffff16805b63ffffffff808216600090815260026020526040902054610d2c9186919061176616565b15610d3b575060019392505050565b8063ffffffff16600003610d4d5750601e5b80610d5781613e46565b9150508163ffffffff168163ffffffff1603610d08575060009392505050565b610d82838383611589565b505050565b600081600003610d9957506000919050565b81600103610dc857507f0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1919050565b81600203610df757507f0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290919050565b81600303610e2657507f21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20919050565b81600403610e5557507f2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e919050565b81600503610e8457507f120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf919050565b81600603610eb357507f01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76919050565b81600703610ee257507f2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b919050565b81600803610f1157507f067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1919050565b81600903610f4057507f1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972919050565b81600a03610f6f57507f2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686919050565b81600b03610f9e57507f0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7919050565b81600c03610fcd57507f0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73919050565b81600d03610ffc57507f1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1919050565b81600e0361102b57507f0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a919050565b81600f0361105a57507f2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9919050565b8160100361108957507f14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3919050565b816011036110b857507f071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3919050565b816012036110e757507f2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5919050565b8160130361111657507f20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5919050565b8160140361114557507f1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755919050565b8160150361117457507f1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3919050565b816016036111a357507f038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30919050565b816017036111d257507f17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4919050565b8160180361120157507f0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491919050565b8160190361123057507f09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2919050565b81601a0361125f57507f1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9919050565b81601b0361128e57507f064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3919050565b81601c036112bd57507f1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f919050565b81601d036112ec57507f2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c919050565b81601e0361131b57507f0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee919050565b81601f0361134a57507f14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14919050565b8160200361137957507f0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d919050565b60405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610596565b919050565b60006113d38383306119db565b9392505050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061141057611410613de8565b602002602001018181525050919050565b60008061143883604051806020016104a2906139a2565b9050803b600081900361158257600060405180602001611457906139a2565b6020820181038252601f19601f8201166040525090506000858251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115045760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574466163746f72793a206661696c656420746f206465706c6f792060448201527f77616c6c657400000000000000000000000000000000000000000000000000006064820152608401610596565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461157f5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574466163746f72793a206465706c6f79206d69736d6174636800006044820152606401610596565b50505b5092915050565b6040805160028082526060820183526000926020830190803683370190505090506115b384611a05565b816000815181106115c6576115c6613de8565b60200260200101818152505082816001815181106115e6576115e6613de8565b602090810291909101015260065473ffffffffffffffffffffffffffffffffffffffff1663ea50d0e483836040518363ffffffff1660e01b815260040161162e929190613d2e565b602060405180830381865afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190613dc6565b6116bb5760405162461bcd60e51b815260206004820152601460248201527f6e6f7465207a6b2070726f6f66206661696c65640000000000000000000000006044820152606401610596565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301839055610ce68361176a565b600080827f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f800000081111561175b576000611751827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001613e84565b9250925050915091565b600194909350915050565b1490565b60035460008054909163ffffffff64010000000090910481169161179091166002613fa8565b63ffffffff168163ffffffff16036118105760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201527f7665732063616e206265206164646564000000000000000000000000000000006064820152608401610596565b8083600080805b60005463ffffffff90811690821610156118b157611836600286613fec565b63ffffffff16600003611874578392506118558163ffffffff16610d87565b63ffffffff821660009081526001602052604090208590559150611890565b63ffffffff811660009081526001602052604090205492508391505b61189a8383611a0f565b93506118a760028661400f565b9450600101611817565b50600354600090601e906118cc9063ffffffff166001614032565b6118d69190613fec565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff831690811790915560009081526002602052604090208590559050611927866001614032565b6003805463ffffffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905550939695505050505050565b60007401000000000000000000000000000000000000000082106119d75760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b5090565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b806113c181611a91565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110611a4857611a48613de8565b6020026020010181815250508281600181518110611a6857611a68613de8565b602002602001018181525050611a89611a7f611b03565b82600260006130f3565b949350505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110611b005760405162461bcd60e51b815260206004820152601960248201527f4669656c643a20696e70757420697320746f6f206c61726765000000000000006044820152606401610596565b50565b611b0b6139af565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b60008061310a613104865160401b90565b87613179565b905060005b8551811015613154578481101561314c5761314c86828151811061313557613135613de8565b60200260200101518361321b90919063ffffffff16565b60010161310f565b5082156131665761316681600161321b565b61316f816132cd565b9695505050505050565b6131816139d4565b60006040518060c0016040528085815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060800160405280600081526020016000815260200160008152602001600081525081526020016000815260200160001515815260200184815250905083816040015160036004811061320f5761320f613de8565b60200201529392505050565b8160800151158015613231575060038260600151145b156132505761323f8261340c565b506020820151526001606090910152565b816080015115801561326757506003826060015114155b156132a85780826020015183606001516003811061328757613287613de8565b6020020152606082018051600191906132a190839061404f565b9052505050565b8160800151156132c957602082015181905260016060830152600060808301525b5050565b6000816080015180156132e257506060820151155b156132f65760006080830181905260608301525b816080015161336357600061330a8361340c565b60016080850152905060005b60038110156133595781816003811061333157613331613de8565b60200201518460200151826003811061334c5761334c613de8565b6020020152600101613316565b5050600360608301525b60208201515160015b60038110156133cc5783606001518110156133c4578360200151816003811061339757613397613de8565b602002015184602001516001836133ae9190613e84565b600381106133be576133be613de8565b60200201525b60010161336c565b506001836060018181516133e09190613e84565b90525060208301516060840151600091906003811061340157613401613de8565b602002015292915050565b613414613a16565b60005b600381101561345157826060015181106134495760008360200151826003811061344357613443613de8565b60200201525b600101613417565b5060005b60038110156134c05761349d8360200151826003811061347757613477613de8565b60200201518460400151836004811061349257613492613de8565b602002015190613548565b836040015182600481106134b3576134b3613de8565b6020020152600101613455565b506134e082604001518360a00151600001518460a0015160200151613575565b6040808401919091528051606081018252600080825260208201819052918101829052905b6003811015611582578360400151816004811061352457613524613de8565b602002015182826003811061353b5761353b613de8565b6020020152600101613505565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b61357d613a34565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b60048110156135e8578581600481106135c4576135c4613de8565b60200201518282600481106135db576135db613de8565b60200201526001016135a9565b506135f2816136e3565b600061360060026008614062565b905060005b81811015613632576136188386836137dd565b6136218361384a565b61362a836136e3565b600101613605565b50600061364060388361404f565b9050815b818110156136965761366f86826040811061366157613661613de8565b602002015151856000613492565b84526136828460005b602002015161388a565b845261368e84886138ad565b600101613644565b5060006136a56038600861404f565b9050815b818110156136d6576136bc8588836137dd565b6136c58561384a565b6136ce856136e3565b6001016136a9565b5092979650505050505050565b60006136f88260016020020151836000613492565b9050600061370f8360036020020151846002613492565b905060006137268460016020020151856001613492565b90506137328183613548565b905060006137498560036020020151866003613492565b90506137558185613548565b905060006137638480613548565b905061376f8180613548565b905061377b8183613548565b905060006137898680613548565b90506137958180613548565b90506137a18185613548565b905060006137af8483613548565b905060006137bd8685613548565b918952506020880191909152604087015260609095019490945250505050565b60005b6004811015610ce85761382b8383604081106137fe576137fe613de8565b6020020151826004811061381457613814613de8565b602002015185836004811061349257613492613de8565b84826004811061383d5761383d613de8565b60200201526001016137e0565b60005b60048110156132c95761386b82826004811061367857613678613de8565b82826004811061387d5761387d613de8565b602002015260010161384d565b6000806138978380613975565b90506113d3836138a78380613975565b90613975565b6000805b60048110156138e5576138db8482600481106138cf576138cf613de8565b60200201518390613548565b91506001016138b1565b5060005b6004811015610ce85761392983826004811061390757613907613de8565b602002015185836004811061391e5761391e613de8565b602002015190613975565b84826004811061393b5761393b613de8565b60200201526139568285836004811061349257613492613de8565b84826004811061396857613968613de8565b60200201526001016138e9565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b6105258061407783390190565b60405180604001604052806139c2613a34565b81526020016139cf613a52565b905290565b6040518060c00160405280600081526020016139ee613a16565b81526020016139fb613a34565b815260006020820181905260408201526060016139cf6139af565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b613a6a613a34565b815260200190600190039081613a625790505090565b600060208284031215613a9257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613af157613af1613a99565b604052919050565b600082601f830112613b0a57600080fd5b813567ffffffffffffffff811115613b2457613b24613a99565b613b376020601f19601f84011601613ac8565b818152846020838601011115613b4c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b8257600080fd5b863573ffffffffffffffffffffffffffffffffffffffff81168114613ba657600080fd5b95506020870135945060408701359350606087013567ffffffffffffffff80821115613bd157600080fd5b613bdd8a838b01613af9565b94506080890135935060a0890135915080821115613bfa57600080fd5b50613c0789828a01613af9565b9150509295509295509295565b60008060408385031215613c2757600080fd5b823567ffffffffffffffff80821115613c3f57600080fd5b613c4b86838701613af9565b9350602091508185013581811115613c6257600080fd5b8501601f81018713613c7357600080fd5b803582811115613c8557613c85613a99565b8060051b9250613c96848401613ac8565b8181529282018401928481019089851115613cb057600080fd5b928501925b84841015613cce57833582529285019290850190613cb5565b8096505050505050509250929050565b600080600060608486031215613cf357600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613d1857600080fd5b613d2486828701613af9565b9150509250925092565b604081526000835180604084015260005b81811015613d5c5760208187018101516060868401015201613d3f565b50600060608285010152601f19601f820116830190506060810160206060858403016020860152818651808452608085019150602088019450600093505b80841015613dba5784518252938201936001939093019290820190613d9a565b50979650505050505050565b600060208284031215613dd857600080fd5b815180151581146113d357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff821680613e5c57613e5c613e17565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b818103818111156104c2576104c2613e17565b600181815b80851115613ed4578163ffffffff04821115613eba57613eba613e17565b80851615613ec757918102915b93841c9390800290613e9c565b509250929050565b600082613eeb575060016104c2565b81613ef8575060006104c2565b8160018114613f0e5760028114613f1857613f49565b60019150506104c2565b60ff841115613f2957613f29613e17565b6001841b915063ffffffff821115613f4357613f43613e17565b506104c2565b5060208310610133831016604e8410600b8410161715613f80575081810a63ffffffff811115613f7b57613f7b613e17565b6104c2565b613f8a8383613e97565b8063ffffffff04821115613fa057613fa0613e17565b029392505050565b600063ffffffff611a89818516828516613edc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff8084168061400357614003613fbd565b92169190910692915050565b600063ffffffff8084168061402657614026613fbd565b92169190910492915050565b63ffffffff81811683821601908082111561158257611582613e17565b808201808211156104c2576104c2613e17565b60008261407157614071613fbd565b50049056fe608060405234801561001057600080fd5b50600080546001600160a01b031916331790556104f3806100326000396000f3fe6080604052600436106100385760003560e01c806302cba7411461004457806316f0115b146100795780636dbf2fa0146100cb57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b5061006461005f366004610343565b6100f9565b60405190151581526020015b60405180910390f35b34801561008557600080fd5b506000546100a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610070565b3480156100d757600080fd5b506100eb6100e6366004610384565b610221565b60405161007092919061040d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f7279000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190610484565b949350505050565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f727900000000000000000000000000000000000000006044820152606401610177565b8573ffffffffffffffffffffffffffffffffffffffff168585856040516102ce9291906104ad565b60006040518083038185875af1925050503d806000811461030b576040519150601f19603f3d011682016040523d82523d6000602084013e610310565b606091505b509097909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461034057600080fd5b50565b60008060006060848603121561035857600080fd5b83356103638161031e565b925060208401356103738161031e565b929592945050506040919091013590565b6000806000806060858703121561039a57600080fd5b84356103a58161031e565b935060208501359250604085013567ffffffffffffffff808211156103c957600080fd5b818701915087601f8301126103dd57600080fd5b8135818111156103ec57600080fd5b8860208285010111156103fe57600080fd5b95989497505060200194505050565b82151581526000602060406020840152835180604085015260005b8181101561044457858101830151858201606001528201610428565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b60006020828403121561049657600080fd5b815180151581146104a657600080fd5b9392505050565b818382376000910190815291905056fea264697066735822122077d983d5508d9e74f5dae069d8f0aecc88f28aca3bd682f0f947621364292a9b64736f6c63430008180033a2646970667358221220ee6da2c5d6480ae3f7b23516a9047af64a4cb73eb22cae0ddef8918b8d20f56564736f6c63430008180033"; + +type PoolConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: PoolConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Pool__factory extends ContractFactory { + constructor(...args: PoolConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + _splitJoinVerifier: AddressLike, + _hash2Verifier: AddressLike, + _noteVerifier: AddressLike, + _usdc: AddressLike, + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction( + _splitJoinVerifier, + _hash2Verifier, + _noteVerifier, + _usdc, + overrides || {} + ); + } + override deploy( + _splitJoinVerifier: AddressLike, + _hash2Verifier: AddressLike, + _noteVerifier: AddressLike, + _usdc: AddressLike, + overrides?: NonPayableOverrides & { from?: string } + ) { + return super.deploy( + _splitJoinVerifier, + _hash2Verifier, + _noteVerifier, + _usdc, + overrides || {} + ) as Promise< + Pool & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): Pool__factory { + return super.connect(runner) as Pool__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): PoolInterface { + return new Interface(_abi) as PoolInterface; + } + static connect(address: string, runner?: ContractRunner | null): Pool { + return new Contract(address, _abi, runner) as unknown as Pool; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/StealthAddress__factory.ts b/src/contracts/typechain-types/factories/contracts/StealthAddress__factory.ts new file mode 100644 index 0000000..da3747e --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/StealthAddress__factory.ts @@ -0,0 +1,152 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../common"; +import type { + StealthAddress, + StealthAddressInterface, +} from "../../contracts/StealthAddress"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "call", + outputs: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + { + internalType: "bytes", + name: "returndata", + type: "bytes", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "pool", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "address", + name: "dest", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transferErc20", + outputs: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b50600080546001600160a01b031916331790556104f3806100326000396000f3fe6080604052600436106100385760003560e01c806302cba7411461004457806316f0115b146100795780636dbf2fa0146100cb57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b5061006461005f366004610343565b6100f9565b60405190151581526020015b60405180910390f35b34801561008557600080fd5b506000546100a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610070565b3480156100d757600080fd5b506100eb6100e6366004610384565b610221565b60405161007092919061040d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f7279000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190610484565b949350505050565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920666163746f727900000000000000000000000000000000000000006044820152606401610177565b8573ffffffffffffffffffffffffffffffffffffffff168585856040516102ce9291906104ad565b60006040518083038185875af1925050503d806000811461030b576040519150601f19603f3d011682016040523d82523d6000602084013e610310565b606091505b509097909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461034057600080fd5b50565b60008060006060848603121561035857600080fd5b83356103638161031e565b925060208401356103738161031e565b929592945050506040919091013590565b6000806000806060858703121561039a57600080fd5b84356103a58161031e565b935060208501359250604085013567ffffffffffffffff808211156103c957600080fd5b818701915087601f8301126103dd57600080fd5b8135818111156103ec57600080fd5b8860208285010111156103fe57600080fd5b95989497505060200194505050565b82151581526000602060406020840152835180604085015260005b8181101561044457858101830151858201606001528201610428565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b60006020828403121561049657600080fd5b815180151581146104a657600080fd5b9392505050565b818382376000910190815291905056fea264697066735822122077d983d5508d9e74f5dae069d8f0aecc88f28aca3bd682f0f947621364292a9b64736f6c63430008180033"; + +type StealthAddressConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: StealthAddressConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class StealthAddress__factory extends ContractFactory { + constructor(...args: StealthAddressConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + StealthAddress & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): StealthAddress__factory { + return super.connect(runner) as StealthAddress__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): StealthAddressInterface { + return new Interface(_abi) as StealthAddressInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): StealthAddress { + return new Contract(address, _abi, runner) as unknown as StealthAddress; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/USDC__factory.ts b/src/contracts/typechain-types/factories/contracts/USDC__factory.ts new file mode 100644 index 0000000..92b330b --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/USDC__factory.ts @@ -0,0 +1,374 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../common"; +import type { USDC, USDCInterface } from "../../contracts/USDC"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "allowance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "ERC20InsufficientAllowance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "ERC20InsufficientBalance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "approver", + type: "address", + }, + ], + name: "ERC20InvalidApprover", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "receiver", + type: "address", + }, + ], + name: "ERC20InvalidReceiver", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "ERC20InvalidSender", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "ERC20InvalidSpender", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +const _bytecode = + "0x60806040523480156200001157600080fd5b506040805180820182526004808252635553444360e01b60208084018290528451808601909552918452908301529060036200004e83826200029b565b5060046200005d82826200029b565b505050620000793366038d7ea4c680006200007f60201b60201c565b6200038f565b6001600160a01b038216620000af5760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000bd60008383620000c1565b5050565b6001600160a01b038316620000f0578060026000828254620000e4919062000367565b90915550620001649050565b6001600160a01b03831660009081526020819052604090205481811015620001455760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000a6565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166200018257600280548290039055620001a1565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620001e791815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021f57607f821691505b6020821081036200024057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000296576000816000526020600020601f850160051c81016020861015620002715750805b601f850160051c820191505b8181101562000292578281556001016200027d565b5050505b505050565b81516001600160401b03811115620002b757620002b7620001f4565b620002cf81620002c884546200020a565b8462000246565b602080601f831160018114620003075760008415620002ee5750858301515b600019600386901b1c1916600185901b17855562000292565b600085815260208120601f198616915b82811015620003385788860151825594840194600190910190840162000317565b5085821015620003575787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200038957634e487b7160e01b600052601160045260246000fd5b92915050565b610939806200039f6000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063313ce5671161007657806395d89b411161005b57806395d89b4114610153578063a9059cbb1461015b578063dd62ed3e1461016e57600080fd5b8063313ce5671461010e57806370a082311461011d57600080fd5b806306fdde03146100a8578063095ea7b3146100c657806318160ddd146100e957806323b872dd146100fb575b600080fd5b6100b06101b4565b6040516100bd9190610725565b60405180910390f35b6100d96100d43660046107bb565b610246565b60405190151581526020016100bd565b6002545b6040519081526020016100bd565b6100d96101093660046107e5565b610260565b604051600681526020016100bd565b6100ed61012b366004610821565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100b0610284565b6100d96101693660046107bb565b610293565b6100ed61017c366004610843565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101c390610876565b80601f01602080910402602001604051908101604052809291908181526020018280546101ef90610876565b801561023c5780601f106102115761010080835404028352916020019161023c565b820191906000526020600020905b81548152906001019060200180831161021f57829003601f168201915b5050505050905090565b6000336102548185856102a1565b60019150505b92915050565b60003361026e8582856102b3565b610279858585610387565b506001949350505050565b6060600480546101c390610876565b600033610254818585610387565b6102ae8383836001610432565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103815781811015610372576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b61038184848484036000610432565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166103d7576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff8216610427576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b6102ae83838361057a565b73ffffffffffffffffffffffffffffffffffffffff8416610482576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff83166104d2576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610369565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015610381578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056c91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166105b25780600260008282546105a791906108c9565b909155506106649050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610638576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610369565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661068d576002805482900390556106b9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071891815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b8181101561075357858101830151858201604001528201610737565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b919050565b600080604083850312156107ce57600080fd5b6107d783610792565b946020939093013593505050565b6000806000606084860312156107fa57600080fd5b61080384610792565b925061081160208501610792565b9150604084013590509250925092565b60006020828403121561083357600080fd5b61083c82610792565b9392505050565b6000806040838503121561085657600080fd5b61085f83610792565b915061086d60208401610792565b90509250929050565b600181811c9082168061088a57607f821691505b6020821081036108c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561025a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220ce818a16e5ef8eb5cef5c8c5740e70f324205a3969fb9d7a5b19bd4a74af278464736f6c63430008180033"; + +type USDCConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: USDCConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class USDC__factory extends ContractFactory { + constructor(...args: USDCConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + USDC & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): USDC__factory { + return super.connect(runner) as USDC__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): USDCInterface { + return new Interface(_abi) as USDCInterface; + } + static connect(address: string, runner?: ContractRunner | null): USDC { + return new Contract(address, _abi, runner) as unknown as USDC; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/Verifier.sol/Hash2Verifier__factory.ts b/src/contracts/typechain-types/factories/contracts/Verifier.sol/Hash2Verifier__factory.ts new file mode 100644 index 0000000..4cd44ad --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/Verifier.sol/Hash2Verifier__factory.ts @@ -0,0 +1,160 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../common"; +import type { + Hash2Verifier, + Hash2VerifierInterface, +} from "../../../contracts/Verifier.sol/Hash2Verifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f0f2a8e2cddbfb2e3c2f20631d6863721ecf6fd92b708137923ecaa59cfb5566d81526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260016103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f1e318cfa76b8800b6853910481dfbeddeb81550cc816e534540e4f1f1aad491090527f29959033013fb5f34434344b7140512b865c8449c6228d27fe67614ab12996f9610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f05b356275fdd65abe5abddfd849eb8fef39d6d79a8ac252d53900c79b05c7eac610540527f17986da98a25cff58c4b2e9fb9859d5730f94e42062c007247d2d29565a26bf8610560527f1e549b6ea71a852475656ce1506029b5321d71dff5bc3bb390f78943690bc241610580527f126b2d5fa988e32cd676890cfff8cb9feffd7aa2eb0dd04a9403a27d4ea4805a6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527f081bb1c34b5d4fd40fc964782ce43b2379223dec10ece6e63de029c12497e2e1610680527f227bc1fd1f0275982d98e31cc64b68264b3a779bc7e84e5a556f9c10600f52286106a0527f0386ce0b6948e379791cbc7413bc27b8511b004472a2f8cea4a6f5218972ff5b6106c0527ef079a87a78e91c7d9754a1d1fca3b74d0a24b5047eab6a92f898ad460428db6106e0527f0cc782db45a2d2317fd00b9e5d6601d0b5d2eefd4f79bdb7e06617d31b3d6ed7610700527f23061b7267b5fa5bde5fc6f15dda61cdef18efe6bc42b5357f1cd5b3a7c039e7610720527f2e4bb51f573799fb89ba29ed110e9e0f848af3a8d83a1b2533b3e6e3f7d7890a610740527f230281fa4dd5f89d865c0bb30b77ef19efebd41506eefca3404ad52c78a0707e610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f278460e59c525de6e88c33dcbb219645f1dc40f416b2532e3a48a30b71a8812a6108c0527f22fa09cabfbe9836ccad02555248b6de3860ab22ed6b3d01d8aee305d7776de36108e0527f1d57efa5f7f92956d3591956398360d2912a4a6fb4125ec6e42d524c75406ee8610900527f2308257437820484e52bd1c819311ee2dba741da35cc679cd2b0513478e0b168610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212200c21fd4281d309d89bb04fca76b8c8954e9819b6424a3f711852453024ec3e7f64736f6c63430008180033"; + +type Hash2VerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: Hash2VerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Hash2Verifier__factory extends ContractFactory { + constructor(...args: Hash2VerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + Hash2Verifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): Hash2Verifier__factory { + return super.connect(runner) as Hash2Verifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): Hash2VerifierInterface { + return new Interface(_abi) as Hash2VerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): Hash2Verifier { + return new Contract(address, _abi, runner) as unknown as Hash2Verifier; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/Verifier.sol/NoteVerifier__factory.ts b/src/contracts/typechain-types/factories/contracts/Verifier.sol/NoteVerifier__factory.ts new file mode 100644 index 0000000..aed3297 --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/Verifier.sol/NoteVerifier__factory.ts @@ -0,0 +1,160 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../common"; +import type { + NoteVerifier, + NoteVerifierInterface, +} from "../../../contracts/Verifier.sol/NoteVerifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af357637e5769bf60e01b60005260046000fd5b5050612cea80610b046000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517fc2b7a5cda87168515dc27c8fa0d5c9b61636428a1235f13396507553f296259081526020015b60405180910390f35b61008161007c366004612bef565b610091565b6040519015158152602001610065565b61040061038081905260026103a0527f06fd19c17017a420ebbebc2bb08771e339ba79c0a8d2d7ab11f995e1bc2e59126103c0527f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b0400016103e0527f18c1374945378ca52d8c278cbe9f1b1b434556a5455af4d439bfda1cc6afbaf990527f0e0e833036da060172af01f456e419e3ff23f27385fc9e2682063060ec4f66ba610420527f2bedcc0698bdb910b6808a7828ab46326e6c0517f39f233cfb4dcc780b2d6e19610440527f0340901ce3c42e61ef4da2f3981bc0fd80c868864191f863aad9f10a2cc2d302610460527f1f0e6b151ae6542ed493eef710b3b98405e1732ac97adff2e1a5cce4ec4873ca610480527f1cc05f3e751cbdf16ff8aee174dc0ba81786aed30ffb2ab551f68e3a7d6fa4a96104a0527f2c4101f56cdb73dd71cf2c33dff7c0ab74a083d3a46608012ed00fc101a8c22d6104c0527f137f51c2eb46e1ba1568048b5c15dbca3fdb8bbfebf30e34589a648cb3be2a736104e0527f2e981c6a754cb3306a2de2c6cb4ee20517a0a91b022d800acc5dc8ca532bc9a5610500527f0d137947c6dd16b259f124962ecd4690a13785865b3cd2cc51d747c9ea9852cf610520527f2ddae387c5716a33d94380dc75305c72fbb7449150dc2117bb478b895ba676c8610540527f2f580b738716d9b90707c15e121479963dede1ce7087d6d76f079e19fbb0dba0610560527f0516cbe34fada755d126cf09a0f2d433bb0b540cc4d58a94b7abca09d0d36a11610580527f2bc118e3407a483993d34dd4c74d3d7df661fccd579ccce74d73377234979e4e6105a0527f2fc2c90af75adec629642a12c906af7780c889438a32f99c937df845312ed4d56105c0527f2e2e3d00aef0d583e95ac7b554bd8d5091169a86aee5114d156ec8df37bcd6cf6105e0527f273d40dd3bce751580483c8ead88f94535448de8088456fe83376e05cccbdc98610600527f2be69038eb9852beb166fd7755183ce25790491400ac1b7fc47628525702f1c3610620527f0b75803d020993aae12fff4b302511645807e72d327c5926373e9e8020dd24c2610640527f24c953be9c18ddcafc2845fa8b22fb449ff1e375e71f9a4f199f390aba584c4e610660527ee62a2e568366b4a09e9986c2c269ce07d2c434ac856581f3dda8f7d8436114610680527f0eb1af547727e1e43ec53837958947355ebf817c770e724cb8066f1325fc14666106a0527f0434698126b44de01d4bdd6336d51316e75c31721e0f1bdcc4ba2b7a2acb0bef6106c0527f0923101b70557ac8732fef0265938d1f2fdb7821f4624789948bcd30d09643316106e0527f2fa9b5ac13eff27575e40dcf5ee416bf3732dcbd9e1365010a5d5dc3431dfd74610700527f09676ab6a62f771bf08bd7e61cb057ddd85e0b7d92a18951e9ad6d0e9559af59610720527f1ed35e584f3df002ec044d11a84164e8b141a2db2a373a0e9120d51aa434051b610740527f154d097a9483c627637bfbe5fd291c364bc5031a38711ed2542e83a596016c4c610760527f2a8f38a4936cba151811671d5afeec5d7466709833ba96686626ff1ad1da4b7b610780527f0146ad4600c8edb6d0e56554c645120149cf7845ed8d2934f882de29bf3d05a66107a0527f0108ef8c537ae19c420007cfcacf061de82808857de55bb1c111540df0f49ac86107c0527f0446adf3fc100bbb58aeccf275df0982d9b2eaf43d36d15127b44975069cc00d6107e0527f19c364f5c0a4b4ab46439ec4f6b41e85bcb447b3b3d56c498fffb24a8e17803c610800527f261fa22dc105a5fb00af42838f77daf11f3dbfbc45adb698569860513d115f0b610820527f1e500c8c409983cf62fa4a2a223db1e322b5e25669fa77f09677ea7d4bea1271610840527f12a6c081b534d611b686901b6ffed9897e341d3b9ba734b7a2c51c3cd5d05ccb610860527f1c10d1c88a68ba01fa9f6c3010e9ae93892ca0617b390ccac9c78d9835e993ef610880527f0462aba4c9975a98994d929f88cbc50b4f6eb3a942f6a6948fac6ba0edc8557c6108a0527f153c176afd9b727ec7f102d92322c680f40d2cbbb24ad5892adb12685da98c676108c0527f111c7eaf020ad257cc40327014599baf5df8d7c2292bf84873fd717dfab854156108e0527f031499d486bb10f77240ee1257b39b308de6a57cab60804648505aa080cc88fa610900527f0c2a3d970c396b7c05e6a17d0c498748300aa952fedc9df5a33863493ac6462b610920527f1fb4ba826a8319abf23ad86553349c4fbfeb88283de440768a5e7626e871dfb4610940527f0fd6897962fcb5c94e14ad50758020526021fd2b3d027670c7b1485fd9122c31610960527f10882e38b0769a32f366fe3acbe3fcd34cc4baea98b8a3a9ae304785353fdeda610980527f292314299a613ead2d28f9e8bbc749c07389cd8af1c1a25598c53bbf8133ded86109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f1c4042c7de3c86d66ed809157a2c7f0aed42b68e6e43404ecaa2e1e9b2e5cc71613300526103a05182811461089f576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1a576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d14577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610eda57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9b565b50505080610f0c577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f48578483840992508001610f33565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7f578483840992508001610f6a565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611075577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce6576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d20576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d81576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de2576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e46576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eae576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f16576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7e576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe6576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204e576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b6576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ae577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e4576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612942576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa357613400516134205185828309866003888386090887838409146129ff576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4d576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad3577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be1577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0557600080fd5b843567ffffffffffffffff80821115612c1d57600080fd5b818701915087601f830112612c3157600080fd5b813581811115612c4057600080fd5b886020828501011115612c5257600080fd5b602092830196509450908601359080821115612c6d57600080fd5b818701915087601f830112612c8157600080fd5b813581811115612c9057600080fd5b8860208260051b8501011115612ca557600080fd5b9598949750506020019450505056fea26469706673582212202c3afaf2ebe595d19832cfb10581f8641bd099139221697c0f8462367c3cc8b264736f6c63430008180033"; + +type NoteVerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: NoteVerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class NoteVerifier__factory extends ContractFactory { + constructor(...args: NoteVerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + NoteVerifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): NoteVerifier__factory { + return super.connect(runner) as NoteVerifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): NoteVerifierInterface { + return new Interface(_abi) as NoteVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): NoteVerifier { + return new Contract(address, _abi, runner) as unknown as NoteVerifier; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin16Verifier__factory.ts b/src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin16Verifier__factory.ts new file mode 100644 index 0000000..f025df1 --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin16Verifier__factory.ts @@ -0,0 +1,166 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../common"; +import type { + SplitJoin16Verifier, + SplitJoin16VerifierInterface, +} from "../../../contracts/Verifier.sol/SplitJoin16Verifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b506180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af457637e5769bf60e01b60005260046000fd5b5050612ceb80610b056000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f858a1ca864aa51d0ed2008c3c74215f009bd505fc7ee2fcc34eff7359ab98ed381526020015b60405180910390f35b61008161007c366004612bf0565b610091565b6040519015158152602001610065565b6180006103805260066103a0527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb6103c0527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d820016103e0527f2ba7c588134c5b978c371074ba67f6dd65c62864a26f4ab74895305e09fd1893610400527f08df6f3bb89a279dbd6445a8659b4a232e319d0ca5972fc795804f27dcfef043610420527f049e4216ba69afc9cc2be2da87769af4e56ca94d71a00bd6007e34e0e3880567610440527f114020e3ec33910300efe6b9b44aca04a523e5f2251b9daa1c9f1e68df3f1d44610460527f15e08c1961d5b1f8c81cb9c97d204c9c947c74b82f28a361a894b1f92285b144610480527f1d7951db90e55bf8325a5785b46ab06909e523e11c47f36ac27e5528082042cd6104a0527f09c9f2bd412564a294756f33dba28f50562c8fa2dc4c0da54daa37969caf560e6104c0527f11eefef74cebe53f04f8591e3b7e65416301afafc5a44ad06ad21157caebcbe16104e0527f2f48124aed83de576ed5e570ec413128901c876ec0339852288977324e0b9415610500527f1025e2e58c9f0200bf9c61efbf20a30856f37652ec98c493fe8080e0cd73d5ab610520527f2c79e5fee2ca2efbff6a579e04e056542eaf6746b2554075d2d1bbd36416cfe5610540527f19c5882cba7a39a09ed4f2c253473e9184317bdc8df4db4212ada03d87b56767610560527f13dccaf6b58e88e9ab9837a5538bc1e17b081cee4c9bf43ee3eb411330d59fc3610580527f25fd0727eb3e03c3dc3221d1c8a432cc9302392ff61ce195bd4c208f14cc932f6105a0527f17de1ad04387d41136801f4a1b8ed7ac6147858366cce063f6820f5229cc10ca6105c0527f2af0a108ed7faa4f4e968b871de1d39983518b22bcd43ff0c98bf36892763dd96105e0527f21959276775cd4749236c8bf773a9b2403cecb45fbf70e6439f73d75442e8850610600527f017714509f01d1a9ee7ebaf4d50745e33a14150b4fe9850a27e44de56d88cb14610620527f2e76c4474fcb457db84fb273ccc10a4647a1a37444369f2f275bb74540f5e2d0610640527f209035caddd02a78acd0ed617a85d782533bd142c6cad8e3338f3142b919c3a4610660527f20961fc1f7200883c98d666ceb7eb9b1117fad03a1fea0110b5e259039a254a6610680527f1e539d50932451c4ef86038844ca00b0d8750ec913d5e47458bc7127e81e5df56106a0527f264a677e00fe429d41253e92578a870620f60e4a821e1a8b1c42c6c6269640256106c0527f203389b61f1426039a8010e7e7cd765121d6bc6801c78179020d839c01c9f5436106e0527f2dc48087219aeed664b3a8e37bf7e9bb6a24d299e9225eda8efe0ac193e3f95f610700527f0842c5fbe77f4d9ac89de1390e7a35a901e6c5f1ca9dac99f48efdc7b8a814b8610720527f02aaee9ddb17dcca59876926cdba89b30ead22b6cd05c55ebb9cc230078b2494610740527f02bc8920bb5e9b63196e5fbfce2dd459d390dbf6ff2463483160acfb0a0d9b30610760527f0c14de0a66a29fef89dd6b25fd3dad2c934048825338d32c9be06295d6895cd3610780527f27e139fd5f94a95aed910fc16c4497e04e258a714b90ff5b7cb6a25af764b5526107a0527f2d283760e83465149e358f2910d2515f4df4e281eb18f1ef89f9ad7e72bbf9bf6107c0527f1e7bc1bdd03c522b54abfc3879fea26bcda8b544a524e1ca08ef3d5c5f615c066107e0527f26ac63c1f22adb0e7f8bbcb49f009546c50d24b1247a743a505416bd4bf12e27610800527f1542e08ee844541bb7f00b5d7e456b1454a0f66a8793e87ee99a04b4686631b1610820527f2c5519e9f4218e2873b91dacf2c455670a5bbbd72ce413230f8b88aea0b1cda8610840527f207960ab6d379cbcdd1ec8b7d562f474d2df14bcf4faa4346a82d4dcbba683dd610860527f254c7c79f29e6f05184889d52a7c01375832d53ea8dd60b93162a5805d715657610880527f23558713233600d8847c983db3c2771210aad83fc39e33f4821c4b483fe579c16108a0527f296d97815b68d47aebb8633c0cd6521ec08a3b4341e1c08038d29b3ee056bad76108c0527f22f13d8c739985db5b795429154f560091c3304e2cdf4403690a4555701769256108e0527f24a9b59777276b962abf2b39dbc832b7437bec8499cdd4ae67851076de7e8535610900527f13b53bfc618381fdc46645b6870b3be471c317eb15c66efd5c8fc4177232d280610920527f2e5f18335df451699e64c616eea9a25168a96e1adc1c1e55c1290e9427cdeabc610940527f2bf4a662ba90a3faf0c439c3966824dd73ab8cd5af5c37d6d44557ddc84157fe610960527f17354121035a0d10b0e69d7fd7b184ff9fff7e366ce23c7ffd15fe43e15486d5610980527f065e31729e88376eb618424ef2cdd08e588a8822748dc272a6e138fc59b4b03e6109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4613300526103a0518281146108a0576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1b576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d15577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edb57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9c565b50505080610f0d577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f49578483840992508001610f34565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f80578483840992508001610f6b565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611076577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce7576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d21576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d82576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de3576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e47576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611eaf576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f17576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7f576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe7576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204f576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b7576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128af577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e5576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612943576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa45761340051613420518582830986600388838609088783840914612a00576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4e576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad4577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be2577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0657600080fd5b843567ffffffffffffffff80821115612c1e57600080fd5b818701915087601f830112612c3257600080fd5b813581811115612c4157600080fd5b886020828501011115612c5357600080fd5b602092830196509450908601359080821115612c6e57600080fd5b818701915087601f830112612c8257600080fd5b813581811115612c9157600080fd5b8860208260051b8501011115612ca657600080fd5b9598949750506020019450505056fea2646970667358221220fe40f32326550f06de5c9e39eae7c73c13c432d89867bf72e452efe813956e1864736f6c63430008180033"; + +type SplitJoin16VerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: SplitJoin16VerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class SplitJoin16Verifier__factory extends ContractFactory { + constructor(...args: SplitJoin16VerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + SplitJoin16Verifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect( + runner: ContractRunner | null + ): SplitJoin16Verifier__factory { + return super.connect(runner) as SplitJoin16Verifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): SplitJoin16VerifierInterface { + return new Interface(_abi) as SplitJoin16VerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): SplitJoin16Verifier { + return new Contract( + address, + _abi, + runner + ) as unknown as SplitJoin16Verifier; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin32Verifier__factory.ts b/src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin32Verifier__factory.ts new file mode 100644 index 0000000..6e87839 --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/Verifier.sol/SplitJoin32Verifier__factory.ts @@ -0,0 +1,166 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../common"; +import type { + SplitJoin32Verifier, + SplitJoin32VerifierInterface, +} from "../../../contracts/Verifier.sol/SplitJoin32Verifier"; + +const _abi = [ + { + inputs: [], + name: "INVALID_VERIFICATION_KEY", + type: "error", + }, + { + inputs: [], + name: "MOD_EXP_FAILURE", + type: "error", + }, + { + inputs: [], + name: "OPENING_COMMITMENT_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_FAILED", + type: "error", + }, + { + inputs: [], + name: "PAIRING_PREAMBLE_FAILED", + type: "error", + }, + { + inputs: [], + name: "POINT_NOT_ON_CURVE", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expected", + type: "uint256", + }, + { + internalType: "uint256", + name: "actual", + type: "uint256", + }, + ], + name: "PUBLIC_INPUT_COUNT_INVALID", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_GE_P", + type: "error", + }, + { + inputs: [], + name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT", + type: "error", + }, + { + inputs: [], + name: "getVerificationKeyHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_proof", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "_publicInputs", + type: "bytes32[]", + }, + ], + name: "verify", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b50620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e051838283098460038683860908858384091484169350508160005280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af257637e5769bf60e01b60005260046000fd5b5050612ce980610b036000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f07c6437362b082677cebdafa25093f28e7a747da98c0691801a60c207404556581526020015b60405180910390f35b61008161007c366004612bee565b610091565b6040519015158152602001610065565b620100006103805260066103a0527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b76103c0527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10016103e0527f0f2fed374278bdeb954e8fe93de8736c4004a671b9e9a0025aecb0fb1c3bc4a4610400527f112db1a22c41c5589ad28bb2d93d3b567c47c5c72007d7a1cb9e7ed8d5dafa5f610420527f1fd5f9e0d63b25e9e4ca389b28b413058414f165ffad79ccfc60a9aeabae5d56610440527f0d793bc94bb4a9e15b9ab5e5948b8c2f25783b65638fa187e24b7f9cc89c173a610460527f091c48c61636e3eb8d009c494edf7a9d2e0697a3617fe71c2f393fee3aaa656a610480527f158f556e18cea4a327f4f4a5a7174043b91b74eec5e9b1615ca78abecaf30dda6104a0527f187b632fd8d3855f9f7a7ab216ad7b94e3b1d02ae8df8674f74b1f5445a31b436104c0527f0d2fd879c89ed8add9ac35259801a4177869544b3a0e9942d969b291a19cf31b6104e0527f189cbfd786e6a8a6741acd5039e87bfbf81386797fabeb1c12331a7fc66712bd610500527f0b71c8203b3394ce058ab9b1fe2838fe87057569e2da2e3459bc8a39290878c2610520527ea1be76f05633073d7f2f387b33d7335a6f69fb1919988c8579ee2522e4f65e610540527f1565b670ec79c33e9980da37816d27fe0605a3992bbf2dd7a99f6d467065afd4610560527f035c1205b4d7d7e777462f7a51df814b800a34ef2e90f774c040f3461eda1279610580527e796cac46cca20db35410f042c24232969e25e0e970e03da9fa526eeea2993c6105a0527f267c51393730a531077816e9cbc47afa4982ea9ea26f94189561b739cc8a69e76105c0527f0ac3598a83a1b747f29b3eccd46ed7208c8abd8a58e32757a7e09434d24a692b6105e0527f21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576610600527f16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a610620527f2f213c7a4c064a63d6a07366df0ea85aef9ad2125a188c3e656f95471e416a0a610640527f067a270bed55e72ffb3cfa39af3e5b8bcb4961d72bb301978af13c4ddc73e5df610660527f1b82cf17fc795b6c59a8f1dce36e5fbd472fbc1ab3e0bf3b8e14ea2ae488fed4610680527f22f70d427992849ed0b2fda06e5c2eecf6a3c1cc02ee0e30ec213afb89e3276f6106a0527f2d6bb3a024939b6b3095a6c936e32f3ce036083510f1f01a30b50e0a9acfee896106c0527f2fb10ed8d77395c777f94fc29fa38b965ff4f3a9ac0bbc4d55db57a80df85a5a6106e0527f1cb33565c5d90c014c38a155b71b128295c215ba4d9a9b935da9d6fd78c0b718610700527f1c369faafffea6c4ece6a9b4be71c9c260bf5ae6a7c7f030ca11dc4811413473610720527f1db5598e696475bb8be734ef87855801a03e59886361fd0eb64b1d5bbfe2584a610740527f205fca780984939f5d4dc8205937194e964d4ea6e0da45ddcf9f71fb47acee23610760527f187e7e35d0116a6672b2670f83bf4f3257d2c5f95ca990943deb07f98e573f87610780527f01d2b37054e35124153a8d470749d60e55759ae7aa52dd33c253d7f49f31b7686107a0527f2043ac05206a2f580ed0a148adfaa26ef5516184126c9e67a8741e133af924cc6107c0527f2bf9b2f5f18eac63843fec205836e0e4cf77146523cb2b703ec9fd6f505b2a326107e0527f01239374280500d61d963adeadc1cfef87ce7f19adb4f4f90c79f63d96468023610800527f0290f83ff91799507e620788f5072a71dd03df9c5605f9594bec63d1763724ca610820527f089ec02dcc6b3216cf9b4418e0827ad4b07d55d3ffa2b21da0743809bae4c2c8610840527f1c522d467e79e574c6bce1ef45cbb9598cc3a99de2de1ce994d0b657450b05b2610860527f2546faf6466689ca90de400304774d39e62e214c390b3a8673079fdbddecbd33610880527f1d6d3e828b1f70d792d184284184663d315a9e15827e8b76bcb8118293212f186108a0527f1e698f0adee65e294c2ad23b4e1088690c0dcd9063e8031abdd1b7a42da68ec16108c0527f21b27c3dbdc81da1134b8148a4d58548df9a7b269977467c2b0d028d1a35fc9a6108e0527f1e132debb512de25eef73847cbade44a767b2cb78aa556166fe19ffa446472e0610900527f2ada6c2b3f7156323ab4ac1c0ea358c8bacd5322611179d13ace998efecd3dc4610920527f1a6eac360c1f8df7af8101b953ab4ed9b2fcd5ec4b508773c47cdf02264c37b6610940527f10ac3fbd2ced28e05bcaf84be1a3f6e78853e35de88e4bd0c9dc72f1360a0c7a610960527f0df902cafa1d00135cfc665cdeb84b49a15edb589945840f324d28e3ccdfe1f9610980527f0349ec2a691657f6f6905b57001194f2355224b9fbc74d5fd8435d9658ac6aa66109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4613300526103a05182811461089e576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d19576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d13577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ed957823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9a565b50505080610f0b577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f47578483840992508001610f32565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f7e578483840992508001610f69565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611074577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611ce5576328f6b59560e21b60005260046000fd5b50613160919091526131805261140051611420518482800985600387838609088683840914611d1f576328f6b59560e21b60005260046000fd5b50816000528060205250506130405160405260406131a06060600060075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d80576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290800960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611de1576328f6b59560e21b60005260046000fd5b50600091909152602052613040518290818180090960405260406131a06060600060075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e45576328f6b59560e21b60005260046000fd5b50816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611ead576328f6b59560e21b60005260046000fd5b50816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611f15576328f6b59560e21b60005260046000fd5b50816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f7d576328f6b59560e21b60005260046000fd5b50816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611fe5576328f6b59560e21b60005260046000fd5b50816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506113405161136051848283098560038783860908868384091461204d576328f6b59560e21b60005260046000fd5b5081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a05184828309856003878386090886838409146120b5576328f6b59560e21b60005260046000fd5b5081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506104005161042051816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa811690506104405161046051816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a051816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e051816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa811690506105005161052051816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa811690506105405161056051816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a051816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e051816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa811690506106005161062051816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa811690506106405161066051816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a051816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e051816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa811690506107005161072051816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa811690506107405161076051816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a05181600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e05181600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610800516108205181600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061084051610860518160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a05181600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e05181600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa81169050610900516109205181600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa81169050610940516109605181600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a05181600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826136605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16806128ad577f4e7197630000000000000000000000000000000000000000000000000000000060005260046000fd5b612b00516126c051612300516123205186828309876003898386090888838409146128e3576328f6b59560e21b60005260046000fd5b50816000528060205250508060405260406131a06060600060075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612941576328f6b59560e21b60005260046000fd5b5081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612aa257613400516134205185828309866003888386090887838409146129fe576328f6b59560e21b60005260046000fd5b50600091909152602052828180096040526040606080600060075afa8216915061344051613460518582830986600388838609088783840914612a4c576328f6b59560e21b60005260046000fd5b50600091825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612ad2577f01882d810000000000000000000000000000000000000000000000000000000060005260046000fd5b61322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa90506000518116612be0577fd71fd2630000000000000000000000000000000000000000000000000000000060005260046000fd5b505050600160005260206000f35b60008060008060408587031215612c0457600080fd5b843567ffffffffffffffff80821115612c1c57600080fd5b818701915087601f830112612c3057600080fd5b813581811115612c3f57600080fd5b886020828501011115612c5157600080fd5b602092830196509450908601359080821115612c6c57600080fd5b818701915087601f830112612c8057600080fd5b813581811115612c8f57600080fd5b8860208260051b8501011115612ca457600080fd5b9598949750506020019450505056fea264697066735822122034599d6501f9934bf132bf2b4def287def85792f7d861c5909edc7f3e19449cb64736f6c63430008180033"; + +type SplitJoin32VerifierConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: SplitJoin32VerifierConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class SplitJoin32Verifier__factory extends ContractFactory { + constructor(...args: SplitJoin32VerifierConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + SplitJoin32Verifier & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect( + runner: ContractRunner | null + ): SplitJoin32Verifier__factory { + return super.connect(runner) as SplitJoin32Verifier__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): SplitJoin32VerifierInterface { + return new Interface(_abi) as SplitJoin32VerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): SplitJoin32Verifier { + return new Contract( + address, + _abi, + runner + ) as unknown as SplitJoin32Verifier; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/Verifier.sol/index.ts b/src/contracts/typechain-types/factories/contracts/Verifier.sol/index.ts new file mode 100644 index 0000000..7d0b08c --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/Verifier.sol/index.ts @@ -0,0 +1,7 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Hash2Verifier__factory } from "./Hash2Verifier__factory"; +export { NoteVerifier__factory } from "./NoteVerifier__factory"; +export { SplitJoin16Verifier__factory } from "./SplitJoin16Verifier__factory"; +export { SplitJoin32Verifier__factory } from "./SplitJoin32Verifier__factory"; diff --git a/src/contracts/typechain-types/factories/contracts/index.ts b/src/contracts/typechain-types/factories/contracts/index.ts new file mode 100644 index 0000000..d4b5f84 --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/index.ts @@ -0,0 +1,9 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as verifierSol from "./Verifier.sol"; +export * as test from "./test"; +export { MerkleTreeWithHistory__factory } from "./MerkleTreeWithHistory__factory"; +export { Pool__factory } from "./Pool__factory"; +export { StealthAddress__factory } from "./StealthAddress__factory"; +export { USDC__factory } from "./USDC__factory"; diff --git a/src/contracts/typechain-types/factories/contracts/test/Poseidon2Test__factory.ts b/src/contracts/typechain-types/factories/contracts/test/Poseidon2Test__factory.ts new file mode 100644 index 0000000..4bd17dd --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/test/Poseidon2Test__factory.ts @@ -0,0 +1,158 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../common"; +import type { + Poseidon2Test, + Poseidon2TestInterface, +} from "../../../contracts/test/Poseidon2Test"; + +const _abi = [ + { + inputs: [ + { + internalType: "Field", + name: "m1", + type: "uint256", + }, + ], + name: "hash_1", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "Field", + name: "m1", + type: "uint256", + }, + ], + name: "hash_1_twice", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "Field", + name: "m1", + type: "uint256", + }, + { + internalType: "Field", + name: "m2", + type: "uint256", + }, + ], + name: "hash_2", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "Field", + name: "m1", + type: "uint256", + }, + { + internalType: "Field", + name: "m2", + type: "uint256", + }, + { + internalType: "Field", + name: "m3", + type: "uint256", + }, + ], + name: "hash_3", + outputs: [ + { + internalType: "Field", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b506123b1806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063055d8d54146100515780636bdcae5c1461007657806390c1174e14610089578063e16f62001461009c575b600080fd5b61006461005f366004612255565b6100af565b60405190815260200160405180910390f35b610064610084366004612277565b6100c4565b610064610097366004612277565b6100cf565b6100646100aa366004612290565b6100f8565b60006100bb838361010d565b90505b92915050565b60006100be82610187565b6000806100da6101e1565b90506100e681846117d1565b506100f181846117d1565b9392505050565b6000610105848484611824565b949350505050565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110610146576101466122bc565b6020026020010181815250508281600181518110610166576101666122bc565b60200260200101818152505061010561017d6101e1565b82600260006118c8565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106101c0576101c06122bc565b6020026020010181815250506100f16101d76101e1565b82600160006118c8565b6101e9612184565b604051806040016040528060405180608001604052807f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e781526020017f0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b81526020017e544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1581526020017f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b815250815260200160405180610800016040528060405180608001604052807f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e581526020017f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d681526020017f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa81526020017f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8815250815260200160405180608001604052807f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490281526020017f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e81526020017f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99681526020017f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e815250815260200160405180608001604052807f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473881526020017f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0681526020017f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754981526020017f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b815250815260200160405180608001604052807f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e881526020017f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f81526020017f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a181526020017f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447815250815260200160405180608001604052807f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf815260200160008152602001600081526020016000815250815260200160405180608001604052807f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811815260200160008152602001600081526020016000815250815260200160405180608001604052807f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75815260200160008152602001600081526020016000815250815260200160405180608001604052807f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5815260200160008152602001600081526020016000815250815260200160405180608001604052807f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c815260200160008152602001600081526020016000815250815260200160405180608001604052807f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5815260200160008152602001600081526020016000815250815260200160405180608001604052807f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d815260200160008152602001600081526020016000815250815260200160405180608001604052807f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b815260200160008152602001600081526020016000815250815260200160405180608001604052807f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85815260200160008152602001600081526020016000815250815260200160405180608001604052807f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb815260200160008152602001600081526020016000815250815260200160405180608001604052807f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c815260200160008152602001600081526020016000815250815260200160405180608001604052807f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08815260200160008152602001600081526020016000815250815260200160405180608001604052807f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59815260200160008152602001600081526020016000815250815260200160405180608001604052807f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c815260200160008152602001600081526020016000815250815260200160405180608001604052807f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb815260200160008152602001600081526020016000815250815260200160405180608001604052807f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b815260200160008152602001600081526020016000815250815260200160405180608001604052807f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db815260200160008152602001600081526020016000815250815260200160405180608001604052807f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926815260200160008152602001600081526020016000815250815260200160405180608001604052807f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8815260200160008152602001600081526020016000815250815260200160405180608001604052807f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b815260200160008152602001600081526020016000815250815260200160405180608001604052807f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a815260200160008152602001600081526020016000815250815260200160405180608001604052807f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b815260200160008152602001600081526020016000815250815260200160405180608001604052807f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0815260200160008152602001600081526020016000815250815260200160405180608001604052807f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5815260200160008152602001600081526020016000815250815260200160405180608001604052807f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9815260200160008152602001600081526020016000815250815260200160405180608001604052807f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da815260200160008152602001600081526020016000815250815260200160405180608001604052807f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729815260200160008152602001600081526020016000815250815260200160405180608001604052807f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa815260200160008152602001600081526020016000815250815260200160405180608001604052807f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf815260200160008152602001600081526020016000815250815260200160405180608001604052807e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e815260200160008152602001600081526020016000815250815260200160405180608001604052807f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65815260200160008152602001600081526020016000815250815260200160405180608001604052807f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187815260200160008152602001600081526020016000815250815260200160405180608001604052807f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3815260200160008152602001600081526020016000815250815260200160405180608001604052807f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0815260200160008152602001600081526020016000815250815260200160405180608001604052807eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64815260200160008152602001600081526020016000815250815260200160405180608001604052807f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a815260200160008152602001600081526020016000815250815260200160405180608001604052807f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d815260200160008152602001600081526020016000815250815260200160405180608001604052807f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f815260200160008152602001600081526020016000815250815260200160405180608001604052807f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173815260200160008152602001600081526020016000815250815260200160405180608001604052807f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16815260200160008152602001600081526020016000815250815260200160405180608001604052807f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705815260200160008152602001600081526020016000815250815260200160405180608001604052807f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a815260200160008152602001600081526020016000815250815260200160405180608001604052807f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9815260200160008152602001600081526020016000815250815260200160405180608001604052807f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16815260200160008152602001600081526020016000815250815260200160405180608001604052807f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0815260200160008152602001600081526020016000815250815260200160405180608001604052807f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5815260200160008152602001600081526020016000815250815260200160405180608001604052807f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505815260200160008152602001600081526020016000815250815260200160405180608001604052807f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d815260200160008152602001600081526020016000815250815260200160405180608001604052807f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025815260200160008152602001600081526020016000815250815260200160405180608001604052807f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355815260200160008152602001600081526020016000815250815260200160405180608001604052807f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac815260200160008152602001600081526020016000815250815260200160405180608001604052807f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3881526020017f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e581526020017f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c81526020017f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f815250815260200160405180608001604052807f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a81526020017f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9681526020017f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce81526020017f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959815250815260200160405180608001604052807f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b81526020017f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a481526020017f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf81526020017f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455815250815260200160405180608001604052807f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433581526020017f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b81526020017f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df81526020017f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404815250815250815250905090565b60408051600180825281830190925260009182919060208083019080368337019050509050828160008151811061180a5761180a6122bc565b6020026020010181815250506101058482600160006118c8565b6040805160038082526080820190925260009182919060208201606080368337019050509050848160008151811061185e5761185e6122bc565b602002602001018181525050838160018151811061187e5761187e6122bc565b602002602001018181525050828160028151811061189e5761189e6122bc565b6020026020010181815250506118bf6118b56101e1565b82600360006118c8565b95945050505050565b6000806118df6118d9865160401b90565b8761194e565b905060005b855181101561192957848110156119215761192186828151811061190a5761190a6122bc565b6020026020010151836119f090919063ffffffff16565b6001016118e4565b50821561193b5761193b8160016119f0565b61194481611aa2565b9695505050505050565b6119566121a9565b60006040518060c001604052808581526020016040518060600160405280600081526020016000815260200160008152508152602001604051806080016040528060008152602001600081526020016000815260200160008152508152602001600081526020016000151581526020018481525090508381604001516003600481106119e4576119e46122bc565b60200201529392505050565b8160800151158015611a06575060038260600151145b15611a2557611a1482611be1565b506020820151526001606090910152565b8160800151158015611a3c57506003826060015114155b15611a7d57808260200151836060015160038110611a5c57611a5c6122bc565b602002015260608201805160019190611a7690839061231a565b9052505050565b816080015115611a9e57602082015181905260016060830152600060808301525b5050565b600081608001518015611ab757506060820151155b15611acb5760006080830181905260608301525b8160800151611b38576000611adf83611be1565b60016080850152905060005b6003811015611b2e57818160038110611b0657611b066122bc565b602002015184602001518260038110611b2157611b216122bc565b6020020152600101611aeb565b5050600360608301525b60208201515160015b6003811015611ba1578360600151811015611b995783602001518160038110611b6c57611b6c6122bc565b60200201518460200151600183611b83919061232d565b60038110611b9357611b936122bc565b60200201525b600101611b41565b50600183606001818151611bb5919061232d565b905250602083015160608401516000919060038110611bd657611bd66122bc565b602002015292915050565b611be96121eb565b60005b6003811015611c265782606001518110611c1e57600083602001518260038110611c1857611c186122bc565b60200201525b600101611bec565b5060005b6003811015611c9557611c7283602001518260038110611c4c57611c4c6122bc565b602002015184604001518360048110611c6757611c676122bc565b602002015190611d24565b83604001518260048110611c8857611c886122bc565b6020020152600101611c2a565b50611cb582604001518360a00151600001518460a0015160200151611d51565b6040808401919091528051606081018252600080825260208201819052918101829052905b6003811015611d1d5783604001518160048110611cf957611cf96122bc565b6020020151828260038110611d1057611d106122bc565b6020020152600101611cda565b5092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284089392505050565b611d59612209565b600060405180608001604052806000815260200160008152602001600081526020016000815250905060005b6004811015611dc457858160048110611da057611da06122bc565b6020020151828260048110611db757611db76122bc565b6020020152600101611d85565b50611dce81611ebf565b6000611ddc60026008612340565b905060005b81811015611e0e57611df4838683611fb9565b611dfd8361202c565b611e0683611ebf565b600101611de1565b506000611e1c60388361231a565b9050815b81811015611e7257611e4b868260408110611e3d57611e3d6122bc565b602002015151856000611c67565b8452611e5e8460005b602002015161206c565b8452611e6a848861208f565b600101611e20565b506000611e816038600861231a565b9050815b81811015611eb257611e98858883611fb9565b611ea18561202c565b611eaa85611ebf565b600101611e85565b5092979650505050505050565b6000611ed48260016020020151836000611c67565b90506000611eeb8360036020020151846002611c67565b90506000611f028460016020020151856001611c67565b9050611f0e8183611d24565b90506000611f258560036020020151866003611c67565b9050611f318185611d24565b90506000611f3f8480611d24565b9050611f4b8180611d24565b9050611f578183611d24565b90506000611f658680611d24565b9050611f718180611d24565b9050611f7d8185611d24565b90506000611f8b8483611d24565b90506000611f998685611d24565b918952506020880191909152604087015260609095019490945250505050565b60005b600481101561202657612007838360408110611fda57611fda6122bc565b60200201518260048110611ff057611ff06122bc565b6020020151858360048110611c6757611c676122bc565b848260048110612019576120196122bc565b6020020152600101611fbc565b50505050565b60005b6004811015611a9e5761204d828260048110611e5457611e546122bc565b82826004811061205f5761205f6122bc565b602002015260010161202f565b6000806120798380612157565b90506100f1836120898380612157565b90612157565b6000805b60048110156120c7576120bd8482600481106120b1576120b16122bc565b60200201518390611d24565b9150600101612093565b5060005b60048110156120265761210b8382600481106120e9576120e96122bc565b6020020151858360048110612100576121006122bc565b602002015190612157565b84826004811061211d5761211d6122bc565b602002015261213882858360048110611c6757611c676122bc565b84826004811061214a5761214a6122bc565b60200201526001016120cb565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284099392505050565b6040518060400160405280612197612209565b81526020016121a4612227565b905290565b6040518060c00160405280600081526020016121c36121eb565b81526020016121d0612209565b815260006020820181905260408201526060016121a4612184565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061080001604052806040905b61223f612209565b8152602001906001900390816122375790505090565b6000806040838503121561226857600080fd5b50508035926020909101359150565b60006020828403121561228957600080fd5b5035919050565b6000806000606084860312156122a557600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156100be576100be6122eb565b818103818111156100be576100be6122eb565b600082612376577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220a368c14890d27d040e118c5f93d87281cafb95be6dba1118128c6bf36096539464736f6c63430008180033"; + +type Poseidon2TestConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: Poseidon2TestConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Poseidon2Test__factory extends ContractFactory { + constructor(...args: Poseidon2TestConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + Poseidon2Test & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): Poseidon2Test__factory { + return super.connect(runner) as Poseidon2Test__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): Poseidon2TestInterface { + return new Interface(_abi) as Poseidon2TestInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): Poseidon2Test { + return new Contract(address, _abi, runner) as unknown as Poseidon2Test; + } +} diff --git a/src/contracts/typechain-types/factories/contracts/test/index.ts b/src/contracts/typechain-types/factories/contracts/test/index.ts new file mode 100644 index 0000000..f0dbf09 --- /dev/null +++ b/src/contracts/typechain-types/factories/contracts/test/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Poseidon2Test__factory } from "./Poseidon2Test__factory"; diff --git a/src/contracts/typechain-types/factories/index.ts b/src/contracts/typechain-types/factories/index.ts new file mode 100644 index 0000000..f167100 --- /dev/null +++ b/src/contracts/typechain-types/factories/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as openzeppelin from "./@openzeppelin"; +export * as ultralane from "./@ultralane"; +export * as contracts from "./contracts"; diff --git a/src/contracts/typechain-types/hardhat.d.ts b/src/contracts/typechain-types/hardhat.d.ts new file mode 100644 index 0000000..642e826 --- /dev/null +++ b/src/contracts/typechain-types/hardhat.d.ts @@ -0,0 +1,477 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { ethers } from "ethers"; +import { + DeployContractOptions, + FactoryOptions, + HardhatEthersHelpers as HardhatEthersHelpersBase, +} from "@nomicfoundation/hardhat-ethers/types"; + +import * as Contracts from "."; + +declare module "hardhat/types/runtime" { + interface HardhatEthersHelpers extends HardhatEthersHelpersBase { + getContractFactory( + name: "IERC1155Errors", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IERC20Errors", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IERC721Errors", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "ERC20", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IERC20Metadata", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IERC20", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "Create2", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "MerkleTreeWithHistory", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "Pool", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "StealthAddress", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "Poseidon2Test", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "USDC", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "Hash2Verifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "NoteVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "SplitJoin16Verifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "SplitJoin32Verifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + + getContractAt( + name: "IERC1155Errors", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IERC20Errors", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IERC721Errors", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "ERC20", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IERC20Metadata", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IERC20", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "Create2", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "BaseUltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "UltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "BaseUltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "UltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "BaseUltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "UltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "BaseUltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "UltraVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "MerkleTreeWithHistory", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "Pool", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "StealthAddress", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "Poseidon2Test", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "USDC", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "Hash2Verifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "NoteVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "SplitJoin16Verifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "SplitJoin32Verifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + + deployContract( + name: "IERC1155Errors", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC20Errors", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC721Errors", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "ERC20", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC20Metadata", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC20", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Create2", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "MerkleTreeWithHistory", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Pool", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "StealthAddress", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Poseidon2Test", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "USDC", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Hash2Verifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "NoteVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "SplitJoin16Verifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "SplitJoin32Verifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + + deployContract( + name: "IERC1155Errors", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC20Errors", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC721Errors", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "ERC20", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC20Metadata", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC20", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Create2", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "BaseUltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UltraVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "MerkleTreeWithHistory", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Pool", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "StealthAddress", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Poseidon2Test", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "USDC", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Hash2Verifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "NoteVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "SplitJoin16Verifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "SplitJoin32Verifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + + // default types + getContractFactory( + name: string, + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + abi: any[], + bytecode: ethers.BytesLike, + signer?: ethers.Signer + ): Promise; + getContractAt( + nameOrAbi: string | any[], + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + deployContract( + name: string, + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: string, + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + } +} diff --git a/src/contracts/typechain-types/index.ts b/src/contracts/typechain-types/index.ts new file mode 100644 index 0000000..0f6e550 --- /dev/null +++ b/src/contracts/typechain-types/index.ts @@ -0,0 +1,46 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as openzeppelin from "./@openzeppelin"; +export type { openzeppelin }; +import type * as ultralane from "./@ultralane"; +export type { ultralane }; +import type * as contracts from "./contracts"; +export type { contracts }; +export * as factories from "./factories"; +export type { IERC1155Errors } from "./@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors"; +export { IERC1155Errors__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory"; +export type { IERC20Errors } from "./@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors"; +export { IERC20Errors__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory"; +export type { IERC721Errors } from "./@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors"; +export { IERC721Errors__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory"; +export type { ERC20 } from "./@openzeppelin/contracts/token/ERC20/ERC20"; +export { ERC20__factory } from "./factories/@openzeppelin/contracts/token/ERC20/ERC20__factory"; +export type { IERC20Metadata } from "./@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata"; +export { IERC20Metadata__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory"; +export type { IERC20 } from "./@openzeppelin/contracts/token/ERC20/IERC20"; +export { IERC20__factory } from "./factories/@openzeppelin/contracts/token/ERC20/IERC20__factory"; +export type { Create2 } from "./@openzeppelin/contracts/utils/Create2"; +export { Create2__factory } from "./factories/@openzeppelin/contracts/utils/Create2__factory"; +export type { BaseUltraVerifier } from "./@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier"; +export { BaseUltraVerifier__factory } from "./factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/BaseUltraVerifier__factory"; +export type { UltraVerifier } from "./@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier"; +export { UltraVerifier__factory } from "./factories/@ultralane/circuits/bin/hash_2/contract/hash_2/plonk_vk.sol/UltraVerifier__factory"; +export type { MerkleTreeWithHistory } from "./contracts/MerkleTreeWithHistory"; +export { MerkleTreeWithHistory__factory } from "./factories/contracts/MerkleTreeWithHistory__factory"; +export type { Pool } from "./contracts/Pool"; +export { Pool__factory } from "./factories/contracts/Pool__factory"; +export type { StealthAddress } from "./contracts/StealthAddress"; +export { StealthAddress__factory } from "./factories/contracts/StealthAddress__factory"; +export type { Poseidon2Test } from "./contracts/test/Poseidon2Test"; +export { Poseidon2Test__factory } from "./factories/contracts/test/Poseidon2Test__factory"; +export type { USDC } from "./contracts/USDC"; +export { USDC__factory } from "./factories/contracts/USDC__factory"; +export type { Hash2Verifier } from "./contracts/Verifier.sol/Hash2Verifier"; +export { Hash2Verifier__factory } from "./factories/contracts/Verifier.sol/Hash2Verifier__factory"; +export type { NoteVerifier } from "./contracts/Verifier.sol/NoteVerifier"; +export { NoteVerifier__factory } from "./factories/contracts/Verifier.sol/NoteVerifier__factory"; +export type { SplitJoin16Verifier } from "./contracts/Verifier.sol/SplitJoin16Verifier"; +export { SplitJoin16Verifier__factory } from "./factories/contracts/Verifier.sol/SplitJoin16Verifier__factory"; +export type { SplitJoin32Verifier } from "./contracts/Verifier.sol/SplitJoin32Verifier"; +export { SplitJoin32Verifier__factory } from "./factories/contracts/Verifier.sol/SplitJoin32Verifier__factory"; diff --git a/src/index.ts b/src/index.ts index 04877f0..e0945c7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,3 +7,4 @@ export * from './note'; export * from './input'; export * from './note-merkle-tree'; export * from './transaction'; +export * from './contracts';