diff --git a/l1-contracts/lib/circuits b/l1-contracts/lib/circuits index e47bcd526f5e..d130d92e125f 160000 --- a/l1-contracts/lib/circuits +++ b/l1-contracts/lib/circuits @@ -1 +1 @@ -Subproject commit e47bcd526f5e38f9603d07d0791984ec53efd254 +Subproject commit d130d92e125f6cdb5a849c4884b2775566ffa64b diff --git a/l1-contracts/script/StakingAssetHandler.s.sol b/l1-contracts/script/StakingAssetHandler.s.sol index c016f891ddf7..ec6f24ceb0c4 100644 --- a/l1-contracts/script/StakingAssetHandler.s.sol +++ b/l1-contracts/script/StakingAssetHandler.s.sol @@ -30,10 +30,10 @@ contract StakingAssetHandlerScript is Test { bytes32 public constant DEPOSIT_MERKLE_ROOT = bytes32(0); ZKPassportVerifier internal constant zkPassportVerifier = - ZKPassportVerifier(0x62e33cC35e29130e135341586e8Cf9C2BAbFB3eE); + ZKPassportVerifier(0xBec82dec0747C9170D760D5aba9cc44929B17C05); - TestERC20 public constant stakingAsset = TestERC20(0x0C04089ED32638ae3cDf649F54F90544aC3Fc199); - IRegistry public constant registry = IRegistry(0xEc4156431d0F3DF66d4E24ba3D30dCb4c85FA309); + TestERC20 public constant stakingAsset = TestERC20(0xad6618B0f91d3fe156eF4CbEb08844C32954f089); + IRegistry public constant registry = IRegistry(0x2e48aDdcA360dA61e4d6C21ff2B1961Af56eB83b); function setUp() public {} diff --git a/l1-contracts/src/mock/StakingAssetHandler.sol b/l1-contracts/src/mock/StakingAssetHandler.sol index be69ec3cc0e8..f80ea96b426c 100644 --- a/l1-contracts/src/mock/StakingAssetHandler.sol +++ b/l1-contracts/src/mock/StakingAssetHandler.sol @@ -7,7 +7,7 @@ import {IMintableERC20} from "@aztec/shared/interfaces/IMintableERC20.sol"; import {G1Point, G2Point} from "@aztec/shared/libraries/BN254Lib.sol"; import {Ownable} from "@oz/access/Ownable.sol"; import {MerkleProof} from "@oz/utils/cryptography/MerkleProof.sol"; -import {ZKPassportVerifier, ProofVerificationParams} from "@zkpassport/ZKPassportVerifier.sol"; +import {ZKPassportVerifier, ProofVerificationParams, ProofType} from "@zkpassport/ZKPassportVerifier.sol"; /** * @title StakingAssetHandler @@ -50,8 +50,13 @@ interface IStakingAssetHandler { error InvalidProof(); error InvalidScope(); error InvalidDomain(); - error ProofNotBoundToAddress(address _expected, address _received); - error ProofNotBoundToChainId(uint256 _expected, uint256 _received); + error InvalidBoundAddress(address _expected, address _received); + error InvalidChainId(uint256 _expected, uint256 _received); + error InvalidAge(); + error InvalidCountry(); + error InvalidCurrentDate(); + error InvalidValidityPeriod(); + error ExtraDiscloseDataNonZero(); error SybilDetected(bytes32 _nullifier); error AttesterDoesNotExist(address _attester); error NoNullifier(); @@ -126,8 +131,18 @@ contract StakingAssetHandler is IStakingAssetHandler, Ownable { address public withdrawer; + // ZKPassport constraints string public validDomain; string public validScope; + uint256 public validValidityPeriodInSeconds = 7 days; + uint256 public validMinAge = 18; + uint256 public validMaxAge = 0; + + // ZKPassport - Excluded counties + bytes32 internal pkr = keccak256(bytes("PRK")); + bytes32 internal ukr = keccak256(bytes("UKR")); + bytes32 internal irn = keccak256(bytes("IRN")); + bytes32 internal cub = keccak256(bytes("CUB")); constructor(StakingAssetHandlerArgs memory _args) Ownable(_args.owner) { require(_args.depositsPerMint > 0, CannotMintZeroAmount()); @@ -303,13 +318,34 @@ contract StakingAssetHandler is IStakingAssetHandler, Ownable { if (!skipBindCheck) { bytes memory data = zkPassportVerifier.getBindProofInputs(_params.committedInputs, _params.committedInputCounts); - // Use the getBoundData function to get the formatted data - // which includes the user's address, chainId and any custom data - (address boundAddress, uint256 chainId,) = zkPassportVerifier.getBoundData(data); + + (address boundAddress, uint256 chainId, string memory customData) = zkPassportVerifier.getBoundData(data); // Make sure the bound user address is the same as the _attester - require(boundAddress == _attester, ProofNotBoundToAddress(boundAddress, _attester)); + require(boundAddress == _attester, InvalidBoundAddress(boundAddress, _attester)); // Make sure the chainId is the same as the current chainId - require(chainId == block.chainid, ProofNotBoundToChainId(chainId, block.chainid)); + require(chainId == block.chainid, InvalidChainId(chainId, block.chainid)); + // Make sure the custom data is empty + require(bytes(customData).length == 0, ExtraDiscloseDataNonZero()); + + // Validity period check + require(validValidityPeriodInSeconds == _params.validityPeriodInSeconds, InvalidValidityPeriod()); + + // Age check + (uint256 currentDate, uint8 minAge, uint8 maxAge) = + zkPassportVerifier.getAgeProofInputs(_params.committedInputs, _params.committedInputCounts); + require(block.timestamp >= currentDate, InvalidCurrentDate()); + require(validMinAge == minAge && validMaxAge == maxAge, InvalidAge()); + + // Country exclusion check + string[] memory exclusionCountryList = zkPassportVerifier.getCountryProofInputs( + _params.committedInputs, _params.committedInputCounts, ProofType.NATIONALITY_EXCLUSION + ); + require(keccak256(bytes(exclusionCountryList[0])) == cub, InvalidCountry()); + require(keccak256(bytes(exclusionCountryList[1])) == irn, InvalidCountry()); + require(keccak256(bytes(exclusionCountryList[2])) == pkr, InvalidCountry()); + require(keccak256(bytes(exclusionCountryList[3])) == ukr, InvalidCountry()); + + zkPassportVerifier.enforceSanctionsRoot(_params.committedInputs, _params.committedInputCounts); } // Set nullifier to consumed diff --git a/l1-contracts/test/staking_asset_handler/bind.t.sol b/l1-contracts/test/staking_asset_handler/bind.t.sol index 91ffc59a5cc7..94d48fec8828 100644 --- a/l1-contracts/test/staking_asset_handler/bind.t.sol +++ b/l1-contracts/test/staking_asset_handler/bind.t.sol @@ -35,9 +35,7 @@ contract BindTest is StakingAssetHandlerBase { vm.assume(_attester != BOUND_ADDRESS && _attester != address(this)); - vm.expectRevert( - abi.encodeWithSelector(IStakingAssetHandler.ProofNotBoundToAddress.selector, BOUND_ADDRESS, _attester) - ); + vm.expectRevert(abi.encodeWithSelector(IStakingAssetHandler.InvalidBoundAddress.selector, BOUND_ADDRESS, _attester)); vm.prank(_attester); stakingAssetHandler.addValidator( _attester, validMerkleProof, realProof, BN254Lib.g1Zero(), BN254Lib.g2Zero(), BN254Lib.g1Zero() diff --git a/l1-contracts/test/staking_asset_handler/zkpassport/ZKPassportBase.sol b/l1-contracts/test/staking_asset_handler/zkpassport/ZKPassportBase.sol index 083a7d79d1c9..1fce14ec49b4 100644 --- a/l1-contracts/test/staking_asset_handler/zkpassport/ZKPassportBase.sol +++ b/l1-contracts/test/staking_asset_handler/zkpassport/ZKPassportBase.sol @@ -4,9 +4,10 @@ pragma solidity >=0.8.27; import {ZKPassportVerifier, ProofVerificationParams} from "@zkpassport/ZKPassportVerifier.sol"; import {IRootRegistry} from "@zkpassport/IRootRegistry.sol"; -import {HonkVerifier as OuterVerifier5} from "@zkpassport/OuterCount5.sol"; +import {HonkVerifier as OuterVerifier7} from "@zkpassport/OuterCount7.sol"; import {MockRootRegistry} from "./MockRootRegistry.sol"; import {MockZKPassportVerifier} from "@aztec/mock/staking_asset_handler/MockZKPassportVerifier.sol"; +import {CommittedInputLen} from "@zkpassport/Constants.sol"; import {Test} from "forge-std/Test.sol"; @@ -14,7 +15,7 @@ contract ZKPassportBase is Test { ZKPassportVerifier public zkPassportVerifier; MockZKPassportVerifier public mockZKPassportVerifier; - OuterVerifier5 public verifier; + OuterVerifier7 public verifier; IRootRegistry public rootRegistry; ProofVerificationParams internal fakeProof; @@ -22,14 +23,15 @@ contract ZKPassportBase is Test { // Path to the proof file - using files directly in project root // Fixtures copied from within the zk passport subrepo - bytes32 constant VKEY_HASH = bytes32(uint256(0x2ab349ef31f5d516da820a3f55f93c53f9c899b0b991c93fc341199cc1e3b36c)); - bytes32 constant CERTIFICATE_REGISTRY_ROOT = - bytes32(uint256(0x130b5775fe59204b0490bdfcdd02bd7cc2bbf5fe3f3fee34cee13c3a3f9b7bbb)); + bytes32 constant VKEY_HASH = 0x2992c925ad8932475d5784bf202b58f1c9d043d6ec04e236a7c761593caea5ce; // From fixtures - see lib/circuits/src/solidity/test/SampleContract.t.sol string constant CORRECT_DOMAIN = "zkpassport.id"; string constant CORRECT_SCOPE = "bigproof"; + // Time when the proof was generated - Tue Sep 09 2025 13:20:59 UTC + uint256 public PROOF_GENERATION_TIMESTAMP = 1_757_424_059; + // Using this base contract will make a zkpassport verifier and proof available for testing purposes constructor() { // Root registry for the zk passport verifier @@ -38,7 +40,7 @@ contract ZKPassportBase is Test { // Deploy wrapper verifier zkPassportVerifier = new ZKPassportVerifier(address(rootRegistry)); // Deploy actual circuit verifier - verifier = new OuterVerifier5(); + verifier = new OuterVerifier7(); // Add to the zk passport verifier bytes32[] memory vkeyHashes = new bytes32[](1); @@ -48,11 +50,9 @@ contract ZKPassportBase is Test { verifiers[0] = address(verifier); zkPassportVerifier.addVerifiers(vkeyHashes, verifiers); - zkPassportVerifier.addCertificateRegistryRoot(CERTIFICATE_REGISTRY_ROOT); - // ( When the proof was made ) - // Set the timestamp to 2025-07-16 20:26:48 UTC - vm.warp(1_752_697_608); + // Set the timestamp to PROOF_GENERATION_TIMESTAMP + vm.warp(PROOF_GENERATION_TIMESTAMP); realProof = makeValidProof(); fakeProof = makeFakeProof(); @@ -66,9 +66,11 @@ contract ZKPassportBase is Test { bytes memory committedInputs = loadBytesFromFile("valid_committed_inputs.hex"); // Order of bytes of committed inputs for each disclosure proof - uint256[] memory committedInputCounts = new uint256[](2); - committedInputCounts[0] = 181; - committedInputCounts[1] = 501; + uint256[] memory committedInputCounts = new uint256[](4); + committedInputCounts[0] = CommittedInputLen.BIND; + committedInputCounts[1] = CommittedInputLen.SANCTIONS; + committedInputCounts[2] = CommittedInputLen.EXCL_NATIONALITY; + committedInputCounts[3] = CommittedInputLen.COMPARE_AGE; params = ProofVerificationParams({ vkeyHash: VKEY_HASH, @@ -76,7 +78,7 @@ contract ZKPassportBase is Test { publicInputs: publicInputs, committedInputs: committedInputs, committedInputCounts: committedInputCounts, - validityPeriodInDays: 7, + validityPeriodInSeconds: 7 days, domain: "zkpassport.id", scope: "bigproof", devMode: false @@ -105,7 +107,7 @@ contract ZKPassportBase is Test { publicInputs: publicInputs, committedInputs: committedInputs, committedInputCounts: committedInputCounts, - validityPeriodInDays: 7, + validityPeriodInSeconds: 7 days, domain: "zkpassport.id", scope: "bigproof", devMode: true diff --git a/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_committed_inputs.hex b/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_committed_inputs.hex index 620b79faebe8..c4f0574c9041 100644 --- a/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_committed_inputs.hex +++ b/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_committed_inputs.hex @@ -1 +1 @@ -00010100000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100010101010101010101000100000000000000000000000000000000000000000000000000503c00000053494c56455248414e443c3c4a4f484e4e593c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c50413132333435363700415553383831313132004d000000000000000000000000000000000000000000000000000801001404fb06e8bf44ec60b6a99d2f98551172b2f2ded80200027a6903002a656d61696c3a7465737440746573742e636f6d2c637573746f6d65725f69643a3132333435363738393000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +0801001404fb06e8bf44ec60b6a99d2f98551172b2f2ded80200027a690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009099699583ea7729a4a05821667645e927b74feb4e6e5382c6e4370e35ed2b23c0543554249524e50524b554b52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000068c027891200 \ No newline at end of file diff --git a/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_proof.hex b/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_proof.hex index f551d609545c..d7ccbecd76a0 100644 --- a/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_proof.hex +++ b/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_proof.hex @@ -1 +1 @@ -0000000000000000000000000000000000000000000000061f5369505c7c649e00000000000000000000000000000000000000000000000b6406960874bc8c1700000000000000000000000000000000000000000000000c69922d2997ecef9100000000000000000000000000000000000000000000000000017c2f0c8178dd000000000000000000000000000000000000000000000005ac17c0f16cc76d260000000000000000000000000000000000000000000000025d8ab07e3198db1d000000000000000000000000000000000000000000000004be886d76ae7ead7300000000000000000000000000000000000000000000000000020e56bb797ca900000000000000000000000000000000000000000000000d7d7474fb7ac681b7000000000000000000000000000000000000000000000005de42520a89e1bac7000000000000000000000000000000000000000000000008228d9c4ca8a91614000000000000000000000000000000000000000000000000000112085e749e6d00000000000000000000000000000000000000000000000d7b057c18808d7234000000000000000000000000000000000000000000000003b9fd7002546e8e440000000000000000000000000000000000000000000000093fce9e91bd2df034000000000000000000000000000000000000000000000000000112735ac34abd000000000000000000000000000000d47d9f9e9e972c3288014db00addbe888e00000000000000000000000000000000002b2b3f5e963e878ce7b57fd23b925f0000000000000000000000000000002c03fd5440c8abfb3387ce72070f14cb7600000000000000000000000000000000000167634d57d180a6e0906da9cb32420000000000000000000000000000005acaf12ac53e0de8bca5f9802e34763af500000000000000000000000000000000002c0607d4719cba5a3e4eb2ccbbe45d00000000000000000000000000000076cc1a78fd32443035dda2cd837634f00b0000000000000000000000000000000000141d07fc3a240937d83f1a0994df18000000000000000000000000000000cfd7001fa11729dd91a3e0473ef9aceacc00000000000000000000000000000000001c3bc693cbb4516fd1dee0a040ca740000000000000000000000000000001b1d749458175dde7c597e99fb821c4baf000000000000000000000000000000000028e8230c75808a6f2b86fe6731847a0000000000000000000000000000007f8ac3fd8b11db1bbdeb99908995b9aa9600000000000000000000000000000000001131f12b9d0f37947ceb6d440a8d000000000000000000000000000000005a9d66bda0d25f7dce01ee4894c2f3e297000000000000000000000000000000000019efd4db2f9dcc5c5d5fc92488fe1f0000000000000000000000000000007f8ac3fd8b11db1bbdeb99908995b9aa9600000000000000000000000000000000001131f12b9d0f37947ceb6d440a8d000000000000000000000000000000005a9d66bda0d25f7dce01ee4894c2f3e297000000000000000000000000000000000019efd4db2f9dcc5c5d5fc92488fe1f0000000000000000000000000000003c53abb187b00486b7bd9f9e771c933cb50000000000000000000000000000000000131dfade5671e4ac02aa16d31693c9000000000000000000000000000000a20ee9966db37dd1ff621f9f713d82569200000000000000000000000000000000002c7ae6cc94b69eaed0a2434cfb6836000000000000000000000000000000e85012ecd8b79ca309721596e6dae0fc3e000000000000000000000000000000000015922181822770a66d6af24f615e3c000000000000000000000000000000cc0d06dc27e4d53e8ca7ccc329e68df89e000000000000000000000000000000000002f23c5fca58fdbd4efd2af7f3ec54000000000000000000000000000000626961379a120f9a7edd2fdc51983d69ed0000000000000000000000000000000000095480aaae90b4d74cffbd8bfe0d5500000000000000000000000000000041af7854446217a9fa7fcd08217f42f0e20000000000000000000000000000000000002f330ce7c5ae8107329d82fa58fc1f6037debc2252687e5f3ab41077120bf798d5c0d10670b71754b68924f2312111041694250f4dc139f10b02710a4651309b1287a8b2ffda2c8d3f0acb0dcee0210d50d3203e0c5ff1a68c1fac9d0cb6703d075cf5db20a54f90f59c8995209a12f80aaf406524bfd65c9e35b0effca96c6cc0c2fd086fa137fd9272ca97d875033af6c5040c0bbb74e03f7a8f086d3bcdc364a4d12986ffc0a01702ae0d069e0985f625ec80a62c3a30b49ba3c7c6ca5f7975499d9e2b34c6316f2a01a24f322f0eedd1451ff74786c0fdabf6bcc1cb121933cd52866e1c1990005e738f05822d8be8baea2cefc6f915378dc4a61c313288e1109a0c4636e90cace940280b22153f8ba64e4711c30599eb10cc650f4a47f44551457cdbb4936e117f57f5c0fb2c57a23c66798b8865d35902f66dc7ad0d9efa464d6e643c2a23643e3487e5131ef6259d12d1bdaee726caef0c7cd40f39de086de6e37f95e004732c79eca3052e665b9d44e170d5af27693593ca636417ff50efa80f25fe21c0821cea9578fd1fca0c4add41b8d359f921491eabf295edc1bac2000be4b857d23cfbaa8ca52308ab30dffd22e257ce5504d7e2db0a540cc0515df495b2672214e7d19e137f8e27a34b7aa8434c244f9a9a32326f8619cb22fa62cb7380a6156e8e5bc420d9062b6d8bedc68f29232e1db9dbb092e5a589463664044b2749d287ed7a31e2f9122f256d19a2ed7838462faf81c363e6a1f3018608aa462799c357adabc66e25a81b0d06046b838e554340909ea4a72948bb39c861948f783f7f6072c8097ab805192d35da66f720469a8379af3887366b6b3386a7f45c43d732454e9ff91bd223118096126e4481178b8b50eee25d10a42408ecf03190befe9e30ca9b51fe756927b25ef35d2dbe7184606328d25920f23389b9dc4bf765c4d493fc34cd5a217a0f9d85395629636da92ed867490e9e801a14058f60771df7c447520e928c317709432813da06bf473cd7ba0a34bfe9cedabcfc38a24ed816f522f6bdf06e7df71e7f56c1d0bc5b24aad6d34db6fe7e0bfc14f8eebb45386174dd39279eb30bec2f3159309f0e9094fbf14f6ecee6e02163e18da2e8b30590f750e28c038882031593d9acd2a4b4e959e7a113bdeacf6d31a81818969a137bf6b46b74bda5eb86233a5bfd05b14200084586621a8bd6537cb83ce5063e5b032925ed961d674dc629ef5b52c897783f3fc14417e8532f195d7960daba2946fbee90baee8ae2afff2c2e92868c87d39c3952f81c823164bb2331516a4106113540bc8bc92ffdbf6f166ffd361939c3187936a753f1199f0f7600ae2852fe15925ecd904c8be7ecfd2e645637aed63a8cf95a605fc555a20a262b18264a2b7b36a711f479eb11d76b2087c3fc734deb00e6baf9700a8cdf14581a1e5c9a024f25039b1f0415191f8005a0297fda0fc0d16575de250d1e84601c64cb5c603d8626aa38d2b239a9f347021f306ab9a2a481889ac6c8a7253b9d9927a53ac445995379f5034826294eb8223422cf10a36b47c44e10169506e61f11d4220aea5cd22e1bfdca00c5a2561a05b0ea4b0385906f4448bc094dc5168fb1fbda452e7918abd0a510789b4f02101bcb3b28c88195005ad738e31d97c9deebbb1e51c5db0fedfbdd98542fe079550b3e836c770159cf910dae986a1f299215ff5e80bedae677f6be8d0d4c9a6f3e2fdaf08eb5a9294baece27e4d775d0973b32720ba4ad1c13fa6c53413d94c5200944ed676c4cb25994f272673daffd2a92d39661a1e21737f0fdb3a870faa5640a958483dc7b0dae8f760d9f345219e79d78b36cfc174e28cd648f8680222cc5035783bb9307826f863c9c05bca346873411c0ae3aaed7e867e42c9152d5be291b1c65aaac38956a30f87401be05b191e21b78060751f2a71c95e41d06da478e2bb4e335c766a85ebda20236bbf8adf48659fd68181e6e05d34160429e4dcc2d26b9a51c5ce0dfb9390d9459e16e6bca051897434635d3db4108397e389dc5be21c27f100a47e4bcc7add8269554dc4f73ed62907c9eac5e6ef59e962827001f1074adb88db2f6c81edfbd3dbf7c39f343d43f166d71413d9ed46131f122583001170f4a211a9ebcb785421f183ebf7ac5795a3e61699479a0c6601ce675b45f156a6f3d6c31fae43b2220453c356edcf2e91f3f77ebb648fc03142a042869d50d390b69dc6a92c4c47f15fca8d50c77c473d06278238becbc49deec47752da00e367395fd747da6818713aaea0ff6aa5ca822c2685f4883b32e68171f81ff1d07eda783750001cc1b883f404a02e28f7a671b397f4d58e00cc9f8f3ca70d34b2b825d91457a15e33070c30173ddb175070b186878bbaebcbc7bb94dd8d203ee13a7b2cad8e5d90e335ce1a33bc69a738c876926c2332a2e9742d841323090211f7cad846e74550e8cff8892316e8a38dd0ee0096eb9f93b1e1d706037ef331106666dca344b4fa4cbe4055ddd3cb5bf05df41c9f2bd1f1808c50577ad1f95040645abc0d544d150dcca0430d07fe9a26b0d12756592564c0c23ffbf66b90d31064d2291d44a9a77e2ba22fb0d29b10dcfa3c51feb9d7ab0a90cf5dc8a7dbdb82b555571b95c025f4898609c13b4cd670985c1f5055199ac12e3e94e0a32cdf213b5b29cf26335cb0b0bdb6f523a810d9ad4eac0b2f1866412db7ead51f852a92b9c25de069387bf5cb7acb9e1dc57c02976457767570c5286a53fdf863280cb210156bfe155ce39d9d75d28170f18566082df3874fac0cd7f198881d236ddf50f90d8d77227f533db2fbfd1ea049440b62f674a8fd7f77dd879821340debf072473491814404dd19b4ac50e6a5914ddba69201a4fc2a2950d439350122994d02476a166145efeb4d0e4cf059bd7138eeb89f2d4a86f8613dec4759fd9f2d17508b5d738293ff4220711b2523fe0915618f78d4e3ddd1403b2b13909c96c1543291d864bd9ff0a6f0a3cdc82607255cacdf88d7c38d339b7e2b25c54394f63661b49b8d29305644804cb6fed517f6cd345ca2b02fda2f3cb22759f75ab2fbc8c26ada5cbbf27ef089f7c82c133d63163b7fea29afc86bb29bc86c4092e9339b31750d59ffd78e2552e6ebcb055a333d6fff300447e3ae50862834b2f61a62f0f2fb3a7c5af81571255edc4a64c76e3b86461dad0908dd823767017c915b1a92a253f93252cab34e80959afe3abdaf403d53dde85e9855959c3bad6e48845a9571addd2f0b368ad3c6d226d40e8b1dffaccfd336fb6c183cf82d3e3758742d75307e8d92cb146041ac2c4bbcce9a0555b52ce2b6a8d7b4e73ada3ce2f5fab67b3011632cab90f359e50e25ce4a4f3c46251c88ba463b667a7b4f8c8fc9e6dd58105f58add6f5a392df4078029f4701627d679a41f476eabe1376b065c16d5fe792a1472132870018b0d552fa964994f990cfb597346244ff125a4d02a802cefcc159519a851daa1c7bada01eac96f8c3b5d4511f9589995516a00cf4388f70f0a1918d379dd7b535c342fa14b8f73cc6dff22c7f9102b022bef334187f6c7c1ab12226d7260fde082cbab6357e6de6d3a8df5e5497306c0b1d76774b97836094424f25729f7f77e7fa5434107220df87a9921b0486b864bbdd5418fec4ee9cd2418f16a2b5fa8d7f5b01b9e8eabb8be1c8a66df53adfa6cbc28356c80784010602324f40f3a832ddd4e42cd90bdc89d6bf3c91a924c774004f54b26a1d4ff1172032c459b40b8d26febe9c247adb8b6c2d561fa0392e36298d353e449a9a028422ae8a65f9c3f51228ec4172e40596ac123debc966888e36f3219de9126f783ed159626bd80e8ccd5e3c544a140752e5e15f6afad51ef26e55f0bc6787deda4810d81e5c69498644a3d3578509705480bd049d7448aa1d2a38ed07142b485474719ebea8d4eea9586a2bce812f48743f5abd6bd108b2263d2608f9c55e6fc20d3146f774ae99294b32f950d8234d422e11e0484e76ba7ebd9824705ea1529d44d18f5929c7ef8f248890a60ac78aee12fa7ea67489cf9cf5cf8a0d728ce93424413a3d7079986e59a7aa84c341df44b82edde0c4d757cb704b17d9441f5420a9c0b5b388c9b3920a1449fc6b7cb850ed1a004b468bfd3eb200b89d65b936701a20204ffa7f2998efb79cb33cc49b5ff7a98e3e27d90e9b094fa6eda85ae82b63b2157242cdfd76f080b7d4c944f6ce6ef9a08b87bdc51bbd70c1f6b317b4e67e8304a9f3b0fe466328ca97792eb1bcd430ebe29b1b128feb4872a0f8b0b1ecaa225f10b779c421782335c598f8e2cd2e9743ccb23d5d1f3f307fb399ca4c2250024cbd7da145488e6323d368117a4726059801b46be8670697e4ff5be855149451ed58cc17eeb5b470021da5f9a8461070b75ba574814d696ba057f305f4a76c10cf9f0c9d6d47c373c3a041706f9d1d0bd11a58d4d70a15cbb08447bf8fd84762bfdff938453c91868b50444c0eafe7aeafccd14479d349b2059dbacdbc9314101cb27ff5be2406e5e0f5afa1a1e5c6d76cd5f075607bbc86a7d428c52d6635e28a591137985b306170f2138bf8240457b722711ff6e9dbaad6acab4329c80202f9831a51f456458cc4ff7e37f45077a9b89d83d27b9d56f6d382629f2f749ec072ba5d73e1ea2fb74c336b916ea826a96a204de9e57994ccf6617caada67e690e1d1d53af771032771d2b04a4df2e93bb2c91aa868ea2e51cf0980bd7b60ac90aa9bc59cea8a076b4cbb9179f5f3a6fa6ec92b6238794e89e54e3e63aa0c64e02d7d0691fbe84bd1a88cd546a89049e4974102bb4c5e67d7ac68334b9c3168b078676aec45f3d71596e73a91339869354740fd78b2714f0665372924d14cfe104ba4289406ba23731e226a56611538bbbeeaa034520db330479bd9dde45ea8d13303d2b6e6deecc7358db8a4b9a3425fd2d29dbd8ca4af9b43dfcc0523983cb2bd83274a9feb157a41dd3f2d124a1dd5c0c1fffdc7473c95c0c1c042384973f1087169628feb91f36fccaa686b658b32e18915931e956ca675323c6aa51ee761a80dced4d904da8334a65fc003a6cb95a75dc8dec7c4c9ffec0840ce3645c551238f702c5b1c16c5353ed688945c7dc2b9c666b37f92e3502e3ec02f641744b1d57561a9c284dc5fa31245d034de5dce4cad4c0786074005cb9f58b4ae1d5622f8bcfd13df2cf311863cc1b90ee307499c7b49e926629987c4b213581f9d61e2bdf238f63ce04702dec5eb4658857da3a88b54d0f3d1fe4aba0d331ad53a21d1e316f5d2b7e9837b4a58cbac36d89b502c3b35ad5aa43b3781424083487afea1cafa5b9091f05a22afb32d55302b13ae59c3d90e1e436fe86d4b0828893b005030029501aeeff76aded85cc4b4d84338b71397ab72441f5ad3a08c51e64c4171f100f42f116df155e536cae436a65a2c26d6290db4752416fa9d70b00ad161927983e1438f95ec65051acab1ae8460feeacc6848faab999da0093512af9aa850e1d16f514453aff48fbe10809cea8ff502a48edb210c62fd9b0e64da9954b2d02cacfdca65b564d372f353b5e645d1e81f61c9215badb7c980da19572f9bab306e76a7e949f29916dd305e065c47b58ba4be64da6a520dee86f0d12fc04968a1f3801e51ec0af51ae4ec2804f42c23eefd804126043ec646446382c8dde5fc41c073b892ddc83b119c3c3be75e60ca77c29b725110250579c27b021ebe510fd04579c789db72331c821c51d97abf183480f47ffec95948867ff4c0658ef6bf706e8bb4c4bfdf7c6bc119c274fb7e6eb570f09d873c42f55dd08dcca345dbc6e0552fbf7ac25c46c26847517f3296b5f7826e66b1e38b3c9be49a612bdb750b70d4bdb014297fd283a37ac3cc3c67392dbfe6d9697545248f1e90a23e27d646d037ae947c375c06edea7639160575338d3c3d7ffbb97943b980b498f3fe4aa8e0968153907538e4d45ac5146ba4b0db179a4d8209ef266fe49eda477c658ad511b4f720131064dc3a64d20c1cc3d22cbe35958834936d0949b12902506f56e732530c06a1462dfc6c5141ac47c341a18a1cecab73347f4da6f21614ab0371591246f8c4454e3783a5366244f14ddd1a1d8ab7a9d748c1ab72521074192eb891807cbff6f859a535ff188bd0a5facd44b161b535c249e72b70db2e2b8cf6446812ac8f580ad2d8f63927c80b4605c145cc3fabe6d570b3df64269d5f8c5b40a912979521a6d026c5f95397ba4051262bf1efb5b9e829a01258b28ab06e95330f503b885c539e42ff969d9528f7688c7cea111818baf24fe501ad5a52eb16574eb188ac8424ede676f4b6c6fda35f69ddca40643bb9d2019fbc79fc6aa283c930e1fc3b6a6bc33126306d227b9cef3fd479362d21ccd04a4727ca53f736216c10b146bcfb531d05898b3ce96bf29145f43527ef7a9c8f2212d1f849be0de98064009b015db1d98c06d21cf6e4cff28c597af4b24f10b2d5aa03ba0f61e0f1c2cea1c8fa594a9bf1823fd338a4139be4566e899d10f92cf6136595c3172a4c4e1300aba365a5c30a4ea60dda0e4d02a6e9e1af7dc7f3427b4653f19facdeb0f79e70005441e6c524d842596206d103f8506bcbcf602e6f1865956cd4ff60868fc98106aaece6e1e1913c9679bfa13f7b26daa1bf979f981cb669af39f6f2e2ca0f116521d86266ff7daa86720c76ad89f1112188602d0768421e3b10618e8637d102d56eb94dce509e0c7fb40b3aa4118f031b07d373ae039419425f8e73977b27f203159cf206cdd1c48c99cc00ce593b9326cd7366d1540f9ba0f13b6c147312c2a66f20583fc2d3c520b05c1bb252d350832ef54372ab27744874b9f722187c912f5cd77da904f6ff7283f096b9b3c19b997fc9f3a1c359c37caf394d2300c442a666856a9a942c3759849e6348d4a302f02a3e2ba8a4ca9a677ccfb5c30f7320562b19e4885f794137d9e283ddae8f2dac1c993af08c8067658ec79d7555b61292e06457d89e8e2eee846587709aa058a45a980f444c5f424add4e5ac1d9eba1c720ff67abcb5ef86c63856a582d39fafe1ab7b50ae19d9171c035edb96e2bd06f2c57fe6922f88dd91a340805e37f6abec75a0d77d33e3c68fba960ca3619d2cd3ad2ea9836a974c8e10fd4604502dd6293f540cfcfe842c35c561e108ab40211a73fd8f7b2003f6aa4ce1a3df0c6f100555a14e356c4d606e9afc8f61f3652c7f0f26f83c8159939ee2205f422e2508af4f22f26da4d87e93215f633117190c95b4130786074a0ed3c554fddfef5cfc55d79e9c7a1a74cb281e2585b4d6161c8e207ef0f6e25b41ec223a9af60e1649cb46bcc8a697125a88e0511d2e12dd264f6e822e68e297e98d7d948cf7e8a685b87a25a3a12ac49ec0a4e698740079238305e9d33a1c709605ce14ee79e96e2d921920dbd26c92ec972ab4a05fe5ac0b5321447da7b124152f8b6d1d60fc70e5eeb3820d0fe3416dbfe3097203468e15443360a6088881a754c645d592208cb87f42044d89644176b73665e9d7a1760e8675af3d2e3fdadc3f04881e68b31b28f04997bbaaeab6943a641e89af3bc701c9336f83c4d955b7cec0d2e2e58eb0211cbf1c543073e4c884cfa000b327cd07309de29df71c19cab946531312e783177babbd1ce576d211c523e76629a6711a8d3984c70684acaed7524853095d31bdc56dbae5930e83a83624ebc31e15a616bbb64dd44ebd8041e58590cdc674145f732e4f87c31472b4c4a505540610682114e40c880d47fd2213de4972dc24aa0e51ae129962110bdf84ae13562d9eb119ade4e4b157c0188bddf2fc043c0612042433223597699d015d55e4f89a7127229afa07af117971b2746364e90952809d5a4b20c98d081f4e6e289e45dda59c0888178a6203ef84df2983e6c20f7df113f002a7748cea5cd6b4757d1d9e9b360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ea07aafaea02039a9b5e4ef8c3e02629c9dd1e3327ec0782a2a7f7bbb5bce272a59230a898b3cb6a9f5680c4d7930c944f05c60ed1a283ccb0b6e2d379cc2f20a4239e26c55929c5f9fac2d7ec3a7483f7cea2e5be2e990ba2a7d9f08b9804f2e8333881f90463146db9617bbc173ac3e2490e084b768bd7517b254e4f498e51c6320029cccd354bff721d085a75d4ce691c8c229691bf3cf85d09cd3586dae14e77b6791bda5971d94bfc6bc6764a5a6a63eec941b463bd0fb84a84069892e18f5e12020f9d83b48bdaedfb9cc5635965a00797b007b87696428323cc744fc0f1167203fbbb9ededb5b4cc18301f9bb34fd9922fa67ffe27f33f21c24c96f629b635148a932327814bf9aa4db8e9f99f6946e92e8afb693d4c481552b0e2551949cd23429a35c658d0cdf586500519e046f6bc186903b09491270e489ebaac25971cc68a21d15fa816cea9804af7d1555de65f1fa174140a442371c3b810ea0d30a2dc367cab0db4a464959c53155ac72cec3ef3d44ea3329dba974819d4db2dd7b26cb545cd7bdc17ab23c410628bb73ac2b50341892d444243e79e9b74f805d821831d10f6002e209f47089974af72c004e002d31941639e08eeb3bccae71a764e1a25994b45e19a0f72cce886b5fd2c35892eb7e15e4482c8541596102f22f880d8be85e79f2bde03d4c26cf89cc2027dbd05cbac4bbc65e438d939fce2295d0aa85c6c1fd56a4e2cbdf8cade05e88da4f1364a3428e110c83326dd445b23edfb9532af8a12ef34b6e7e9b534e431deda145a13556785ac84b3236cca0e07e7556fc839c416d5dd741e6f91f91a92353bdaaad1c66a5c677b864e10fd321a9c8070a391c04dfe44a582e0752c2614f0c08ccc4e07d8404e56dd41482fba21a6051db3c437b0edb80a50be7e25def0ebce71d1485596d77cbf2e806f00ff1b53d0118d60b3925bce87c229adc10818d8e305fc4b45756a1a4a1200bde5262ce4e15d36df6cad8581c3569bdb95d528cbe99175ce538a3f525e8f2d94540d23f71ea8938bc2055cd273242873ec2db87f12888818e0c233cc7d4f544bf7012bd703f93f41e43f624340cb9a759c57fcc7712cd2456b49588a7f359d6fecf90b9d5ed90435c5d3e5c76418652e19cda1bbcaeef2a5b899e522fec7f00581b9264af6de817031bf03b19ad76f9c9493b1f7df60875accea4c96acf5e28aa70f189dbe7d56a72a1908e36cac7473a5af16c5f251aec417e40cd73843e80bfa8a1c515a2038add0235355b37290dc7fd14ab43eefef46afbd40720e402de0a0b72d75e941c8930452663950eedd45cdb66adaf0ea9ac50504fc58b559f8a8f3551df95c8a6a74a5cc7364c9f0a60d6eca6a7ff9dcd043b9590fd5aadab4e6a78e0c97522f406a6b8126189cca500f4cdffceed0bf58decfa6f99660d2a2e23d701f8545f0c8f35f7658d9be03f92491fcbbe9aa5ee8cb85e82d5621bd030bcdf11a79a622d5b4b67cc2d5d1a9351fba2e4cd847ecbf6ae1769e7daea46c94c02a1a79a622d5b4b67cc2d5d1a9351fba2e4cd847ecbf6ae1769e7daea46c94c02a034af755a8c7bc67c76df94ad820cfcc38eeeebddec9576d432855e0e30a513311f9032adfed54cb6f5ac568c24967d3c8420646de9df47142d0e204b58d0f701a1913030a6fbd90d1fbda27e67ade460c2aff7593a4b79aa5d03bb62c23e554089fe9642195cb92871c1034ee2c9670bff973bcd60060046e03ddeb8104b99b1299ff61576fed5dc774b9518cf55d6e368463c434acefc8bebd024e777c9c8000000000000000000000000000000021801046d9d69d21788e737b879d0edf58000000000000000000000000000000000010be5eaa22a791d50839d36a0d5cf90000000000000000000000000000003c92a5201a9dfb2d5201288faed14712bb000000000000000000000000000000000023d394a5df775e64ad45d18998792f000000000000000000000000000000ac041c04dc126c58dc9f1e93f7ee854a6500000000000000000000000000000000001690e22aa2d30502e868933dbc277f0000000000000000000000000000003f33e1f4e818bfbfd85eceac1a97992d84000000000000000000000000000000000008ea280460062b7285f5e32b561004000000000000000000000000000000c5e99942af1720ac051fddc33d7103656d000000000000000000000000000000000014010d83f20e8195bdf8960897e458000000000000000000000000000000e5f7054fccef7c679926effdc4f540a8cf00000000000000000000000000000000002dd7b804a44f804cc5addf1eef34b5000000000000000000000000000000ffadc653b488dfb50870d2e1293ac722d80000000000000000000000000000000000168f683cfa2c77b9adf4c6006e5a720000000000000000000000000000008465962bcf694f0e75d50d1e38dfa304e30000000000000000000000000000000000004456d0abd4f266b34d1e9426bd780000000000000000000000000000000759cc43f972b111e6ddaf403f2457fddb00000000000000000000000000000000001f98fb0fdb7f46fb0bf211db0f6f0b000000000000000000000000000000ab3fef41ff27f9af21ededdd2f124798ff000000000000000000000000000000000028f16d807b90e553882a8af98feab500000000000000000000000000000011042b3de3c798b24264cb2bed9aa1fbc400000000000000000000000000000000002f60bed4091e87d4c9ae1ab4a741c400000000000000000000000000000024609cabdf31b090aa75d1a30981ac332800000000000000000000000000000000000da8a9d88985cd8970b490dba3348300000000000000000000000000000019d275642ef1d757e01aee7e4e9f6ccfd90000000000000000000000000000000000067a295c9d43a0c94ea9a37a59e9a4000000000000000000000000000000ca54dfe5b0a6613756d3ee1628d984a6190000000000000000000000000000000000082a1db6c90a29e19453442599400400000000000000000000000000000096bedabccd557818f7ff960f688f065a7400000000000000000000000000000000000441d44df429ab7661e7f197fbcfcc0000000000000000000000000000001665dbed01b590e4b9fd2579d992f1b4fe00000000000000000000000000000000001362a674206efe7278c4772106899a0000000000000000000000000000008dd0b65a5db00b9eb74566f0eeb06f88ed00000000000000000000000000000000001312a7205bd3e772d4443b09a83a780000000000000000000000000000003b3c456529288ac0d2a078291c4a0d7a1700000000000000000000000000000000000f7f3e754bfd158d47cf21b1db1a6100000000000000000000000000000021f3be785af1117415cb215b7e320163d3000000000000000000000000000000000012178ce7947f28a5e6efdf1f2649050000000000000000000000000000003172fafb3f2d82e7d4aeac7c13f20c9cdb00000000000000000000000000000000000430b942098b5ef7464412a493bedc000000000000000000000000000000b6c7806d2974933386d8b78262ed09b860000000000000000000000000000000000008ff385c7ced8dabaec9e52e6713c300000000000000000000000000000033db2333536747819d232bb6a57c8ebd14000000000000000000000000000000000007aa8d171c71c95a9fe03bbfc2827900000000000000000000000000000053fd113adbe86a55ebe820137b0a6b14bb000000000000000000000000000000000013f68beaa0f3fd51d622aa21d08365000000000000000000000000000000cad0cfaf6299e01488807eb31a3c07d4f00000000000000000000000000000000000134d95e2ccb9254477baba10f7cf8b0000000000000000000000000000003da758935d2e4d5eadaa6070a17a6ad89b000000000000000000000000000000000018182810b640cfa2668b0282c3fd6b0000000000000000000000000000009bbf745cbc3237e5cc673b030e4d8d721c00000000000000000000000000000000002d571c26d9706633b574e8d3fde3cf00000000000000000000000000000081d10a5cb7041327f848efda50956527f000000000000000000000000000000000000447294035b90674492c6b113f4fb70000000000000000000000000000007eeb831c763cf3d91a56dcd8ee59d11f5300000000000000000000000000000000002ba00b2ec257dfae7e7be5192bfad00000000000000000000000000000002c4aeb0d2c4a166cc8dedc453228372f27000000000000000000000000000000000006ad54bbcfda95983e917887bc568c000000000000000000000000000000fa90230e2d81099d0eb0829c458bf90398000000000000000000000000000000000025767905c643a8fbf57b1e6ef19cb9000000000000000000000000000000ecab181e0db951f4fa0e9a47f277e9dc9700000000000000000000000000000000000197190b1c707c28af35d35e460862000000000000000000000000000000e876f7aa40339024c5b2077c92d8130c4f00000000000000000000000000000000000504caf2503b9ae4ce8846a8101f2b0000000000000000000000000000001d00f52f35158c464d01dd7d5142d5b442000000000000000000000000000000000004ef736c7dbf200c097edb4b38597c000000000000000000000000000000a78edc07a84c66837fe6b0f9a19bd68e0200000000000000000000000000000000001d51607ffb212d93cf81da52fae486000000000000000000000000000000705bbc3fb79eb8319a8bb919e973dbe292000000000000000000000000000000000007a758a743d8fee7d87c8b23cddeab00000000000000000000000000000046f52559a16ad3b948e956fbcdda8eea2500000000000000000000000000000000002b211443690308d95527e3b847d77400000000000000000000000000000084eb44b64c0ce54750174e0fe57a3176d8000000000000000000000000000000000014cb63b20fab0e7a19520b3a6f3b4c000000000000000000000000000000c531ad49aa78f1f63257ec93cfbd5a8c27000000000000000000000000000000000019aad592a8692271566119fdebee130000000000000000000000000000005a54a0dc16d4c07711d21d3435cfc0248300000000000000000000000000000000000678c7d10f6480708e2af0fcdcf11f000000000000000000000000000000f73b4d2ad86d886a71da6d3f1542580e4900000000000000000000000000000000000861495ee5cd6d24c195f5f471a67e000000000000000000000000000000bffbaeceba8457d0fd09cbb26a92dade68000000000000000000000000000000000018f1f13e18f2fb59962eff04abd2820000000000000000000000000000006fc2ecbc59470919daab762fc2abf9a71500000000000000000000000000000000001236f58efa742115dc1ceecbf7e48500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000003483f9051e47ca2dfd0ca0d523f2e49e19b17bba404814ccc706a2d5ade2c8001322baf00fcbb694ffa8c81a4b8285a5bbf8405fc6c37c3fc990f84c2fe2b2c0f49af730bbb57af7fda23f5d6b44131f28f540770c7ad620ca74ddd0b91ddc52bc25eeb2806e5ee601df8bb9a5065260ce5ce7f4debd89d68a62122f9e32faf1ac8bd2e5220eebec28a8af9a4ee1a534588d40f4fa0b75f6ea507ac305e1fff1933690e01e0f0b9a9ae2d4de4fecf68435b8ff18ae2406a37bd3e2cdd522dce0db4d4c7d49ae7bf074de43694a2a89b20e85da30117946eb409bcb75f0b5ba723453d8887a410e3359889a7b92b8ea0d91ed588e9382a029f6281e9a162046523d1e5f0032b5abbb0b7ccdfc62830048b1ea0168caaae139236b9f4a4b5c142104db82e24f2e009e73a408ea40fff032d801706252c0f5fc1b5a8095eb12ba82ec90d6eb418a40ab33212407fd8a5260321742e7a3c65c332c7bdd52cbee23e044abebbc673957906349e64c60758fec20917116e6b672da585a5b29f007a4c12b0f90d04465fdc811b49d68c1a53b45ea5d1967064c537fcdca8d27b07922b2232cb21180ae0d5ee1dfd6eea3f952ed4075cfffb0113ebe518c23c7f63f15a0382d900cbee4cbeb59083fd7698f26f59a5264fdead9dd899f6f209a727aed2270a62c66bf7746a71605f6b540dad9bd023bd2aa3b76eda83c87d6e64a05ac923fad6210e93e8ed37650ff570a61c766960e1225cc97abab7e38f9ac5df6ec9021813803d6f8aa9174117b4b585dd64dcf874b20322b8b486157b26b49667b626d7ece8958466c0cee7c9bb7fd3b02f6e35bddf21689dadf390ef1bb27005c10dbae68e576807342cce26959d31e323168c3429f61d4fd9dab2f71afdd9ae311c554a79f5e618f849e3d08b1ee0e3cfcc4f4741d14e8f3a8e5b78be1e2a8eae15c453556c782e4b7955bef115d6a6df5ffd2c751828ef000ffcb5eab3e39582000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000779439c69c388c89828fffed84b265a5b000000000000000000000000000000000002fe9a6165555cd94eea5dae28fa75c000000000000000000000000000000fea37e22f05d4ac981089cc29ed011bec300000000000000000000000000000000000f8d37919e8b740586acb7b42941ed00000000000000000000000000000016e6225edca1eb9cbd535819e7fd5e8d3a00000000000000000000000000000000002e1c1091d781210635f1053f8cb8f4000000000000000000000000000000abea162ec85c7da614334081e16969048900000000000000000000000000000000002ea96dda094f0a59e0b9c1361c6c02 \ No newline at end of file +000000000000000000000000000000000000000000000008f5bcfb80666955f300000000000000000000000000000000000000000000000e36d6884c5fca6e6b0000000000000000000000000000000000000000000000068882932f35a633e400000000000000000000000000000000000000000000000000002e5b7ff8f06b00000000000000000000000000000000000000000000000d6f6e7ab15344ac4b000000000000000000000000000000000000000000000008dae91c96bf52fab000000000000000000000000000000000000000000000000a8fccfb6a47a495250000000000000000000000000000000000000000000000000001fe6cf568a7b400000000000000000000000000000000000000000000000bbb2f40915b74179a0000000000000000000000000000000000000000000000012455cd90fab66fe300000000000000000000000000000000000000000000000948c54f20ab552aa30000000000000000000000000000000000000000000000000000a7f75216832b000000000000000000000000000000000000000000000004f0ef17c3ed4761c8000000000000000000000000000000000000000000000004d67f8ec144074ab300000000000000000000000000000000000000000000000af723ae8da6279e7c00000000000000000000000000000000000000000000000000029fd25b1e2a2a000000000000000000000000000000fd27e0a42811fe601f68824c92da27928000000000000000000000000000000000001b5c4f54375c2bb49c17f877b169b80000000000000000000000000000002365ca6d36ac3d92279ea9691b8521e48800000000000000000000000000000000000aca478bf98643b1355fb252b4f723000000000000000000000000000000b16ce8bca68544b42226dde430911333e100000000000000000000000000000000000f6d5856924af7bedc70e396d63b2c0000000000000000000000000000009207e5e416cf5043da9a26a913959be312000000000000000000000000000000000000b4685e3f94ad30f9c9e238e67c1200000000000000000000000000000094e8446eee4f110cf3355d767bc6bacd2e00000000000000000000000000000000002a242a6d1279fd9eedb12932ab92a20000000000000000000000000000008c51c09c9c2404222adf4c87aacc9b803000000000000000000000000000000000000e788b40a8141468f53da22aada28100000000000000000000000000000030aaae36cd01475f46135cf7bc065b9eda00000000000000000000000000000000001ef6cef632a74763ac78bc5e3e8e600000000000000000000000000000000c19e856ad54a56a7536d6b744389ba87500000000000000000000000000000000002f19774c97404c26b82ed4fa7b545800000000000000000000000000000030aaae36cd01475f46135cf7bc065b9eda00000000000000000000000000000000001ef6cef632a74763ac78bc5e3e8e600000000000000000000000000000000c19e856ad54a56a7536d6b744389ba87500000000000000000000000000000000002f19774c97404c26b82ed4fa7b5458000000000000000000000000000000a44d0e7c349d664d75051c4d48c84ec16a00000000000000000000000000000000000eee181c604ee365a6543474097966000000000000000000000000000000cf4c4829d1133ab5a1dea12bddb5ac9fd1000000000000000000000000000000000018d15e6cd4d3f7c003818ff15ab77d00000000000000000000000000000041b910998a1154441b70c610013561c8a1000000000000000000000000000000000006fed778fe78df62b4714781a8da390000000000000000000000000000001e7b109c5074aef3b3bcb03554f66f998300000000000000000000000000000000001204827201499d699344efcf59e308000000000000000000000000000000c8ee017d9d8420aab94698d3a0ad7225470000000000000000000000000000000000089935d9456f09af1264ef9a31eb000000000000000000000000000000007e776b75db0df471a6f6b04b85a7b5d4eb00000000000000000000000000000000000ee496430651b36378b09e4ee56ca62a4b8c31b780eff2ee6c66c100b22cf5f69cdb56c9c6f5005320370e625b34500618c24129b0b036c9e3def580cf2b6731970cf1aff27b90f0c1be858da4cbb12597a5a4d801c5f5a4e2f23e2466ee7430d2ff805b628b635e208329bead65652e744bde34e785bf6bbf0f0e3c9d7b64321661707b9756e19ea8e07786253b0b16c2039341bbe1fd5ac1d18da41f457d596e4a27067e9736dbdea91982f9aaee1d7080b7588bcae0f1ecebd7666552ef7732efc146eaa29bf6d0965ea18ff97c1c7f1cca7c8a3613f8e388d68a8e0fc12f0571d6359eb34c19316d4e26bfaf9a03869cd0cb714040b5ed9534cfa3dfca58ed99bcba993be140c78fb1122eb47c113a8951bbb5f5fb70876802e5cf380296f0f26cddb1a68dafe492a3d22a5e7100a04d1d92eb46112053fe9da188caa7f01b48782613d70c8a516a8619f9be3e139d8130537c74743015654fcd19eb0cb02868432092f396988c96ba4cb2a9cf1958b1f9a179b6a440d5edc64914aedc2b4fb31792a162e7a3700594f3b1fe3f030ac91447b9929a4363136ca3049059666df980e7ae75ea687df679f5a5261528e7d5d765de0506be323476ccfad5cb60e57978038871e8f284899a09fb693012e242eef4bf95d3900d055ffbfa33398bdf76671e0baceeb60a04a62a73a1ae228cb2eafd480f6fcb1264dca2e799368eed3508d95a16cdd1ec564d5702c18f15e5f6a8ebd0ba2eebc549a7860e5e278f011f82def64c06bde5e1dea547fadf173b95be285977b69f2c1172a6d4d031043a2ec0f3ee895f9b164a4b5a20593a1dbedb42554310c318307c3f2632b815aadbc6a401dea8ebf2683cc290de1cb30d11d129ea3040022c5a1026076f889be2bb7837cb373c95d7e5dcb29d9edeb12b832e16fc1faeb257ff7e23174850d7a18f037cfbe5182683dffdac29f6c5751f93f41d80492e0a32904e28f181015080720e765a9cd11ea6eb10d3aa435d172320c6828803e85a899962824a309662cd51b5ae1a82e93618d18a3776d8b8a51e76ea0df8fcc10c3d4d2e8c5ed4536882fbc908814f387100209f23a46f8bb604db459ddef484712a6c1ab262235ec70370ffb05b3f2532ff708ff27cf06d2b103e3f346254ba77165f7e6058998bb2ab9f076ff6c5b81f7e9941624dcab76913845e712c62078656b6f2eea4948bb6d884683662a808d98b9c76efc701b68626f4f86d6eaa96165b243de40cb6ea232914434cace775633b60d58d1dc27ae722ac77f50126db06411d73a1ad71dcb6b0f4a79b6f9d6e71d78aea28200b7e0d0051e27e7f3d830da02e5dd4a88770f2280369c11087b6ff3c51be692d17b81810ecd42df5233af0da7d01c454a3e023070030619f74331ee63c97158a4434ee2c2cbd22686532326169e118c86a0c128bb89854b196ab6ff1cfa9a86c5380a117eae4a461a771cc978338ce0e9a4bf91accb586ec9a8f791927abf02f095e960ca4602a2df257d3f17c1874ce6155a1fd654de6d7e70e8e9590fbac95590e7123a08b3e9b7c68fd4c17a997e424adea8ec11f73d74d866a70f1dcb3de8eb83808c34f0e9d5175d4e6c19185281abf2e6f5c56d9316facde950b2d397d85008d2f857f2eed1d5f01138d653e552d20a6f12d44395036d5deb5854df0636fe4ba13f858997349ddd747a5de2ec9319930ce6bf73bf63c22ba9f0a441fbf35a81d1dba70655e341575906f4a546913acd8ca03d32c595bcad32ccf2989c1e1942503b2ed444053e124c0ead0670afd8a44ab3570a7c2acb876f84847b08d0e9bca194ac84249b6bf5afc786ea5f17eeb5eaf367a685c395d1074549872cae122a219d98a1aaf14c190b7304d770251a2bf926ef4561e0eda42147e34911a09e5622b3c3e9ec9a169dbccbc82cc8a0fcfd0707b86a59e67fef5edb28ce73df341ff0eca9c9c20584c63cbe98dd37360b20e718e83ae9146c64fede9f3fea0cae7662843b0b2045fe61c13b4c5f184ddfd088b02999ce7e158bc448a7da362c3215411b6e4aab38305bbc262c6a54ef12b08d6321365d3d4a243ab9d649185b8911f04473e05a46837658a4f5795ec4cdc9ef2187df10d3a0adcd50aef461871bb0a06122521065d3ed3f3ec110768f738ead5560d477c63278cb9ec308c6c90cbec2481dd9956fd768e2d99f02a2a928c2a7d980c5720915319fcdf724e0c60e0dc16cf1ba936c70ccb54c67c22a98c8165ae13ae2bda720d1cfbd8132bb195950d29f7822dabd265af06f20ea4ac3ea3d88f8e64275641d7b67eef11bc6f14cc6e2027613639d04db6c9287ea34aa0e76d30c02bbb6e10a3731d5b77d10d051dae185c247d85d2233e3b0d4ae5a81882452eb220ba96a4cacb33c77faa5c6ecb7f031f166aa90ffffc7c486bc2b3b0c5f97f68b101440429e22c680d3b772928b918a559aae4221dbbbfbdd7a579c1eb9af4139b89626d1df014d22c1937c4079425e4f6eebf8155704de4592f4f3e85c5b51d55e8f735b0c43691561058cb4a1e0c4a4a79895666586b348e2b4839260d15ca985c61932800a293a0f3a5414b242557d6bac463a4d7b28947c8d2cfa1e0f14137012d413b065fff897981633f75026147bb8e809f4e1f49d3ecd85f1e7a375d57d91de96983b8a0846de68a08fb1648c5391373a5366cd9833050821ae5f6d4be2b5423669ea443e69514de8f470b14f8c62e9bf076350e8158adf6c7b70d004a1775a363dc61e6a70a45d0e2760c67d81eb6d38f5027694845ebc6fbdae45946f187dae4db7a4b13b364f449700132424bcd6f378a9b66dc80b53c8c82c61ea7b2190f1a45614d3d67aaa1377d0ff93d9cdab97a7299c78480ca70964c7594e1058e5498896f4b8a2437e9fe860122f52bfcff43024c4ba6717138b5417459f17fc070d6ee51c61b5716be1c402a4841e8bc31c8c73c68ec968834c8f510ca573934d8218ab8273695c5270ba306beae7f7b2dbb5f7b1188eba84d2684e8bc283a4d422af68d161b9bd22668d42c65e73eea74aebacf9c6cff8d68dc34c66a18ca4c50f8f5768117329b7cd01c1957cfbbbf89e93c020943abbbf8e92699671621c54e9b9ec2a31d81465d1a6d302fc5e5ba7772852ed515f8185f4ce4913261d8fa6e47d99fd45c5945610e9105afd8f9f512ccd4080ae9c6707a6aa3d01e1bc768ca421f4a7f7e323ce6445309bb4e2aabf4e9d294f3a3a5ad8d00528528e1f061eb251748d6ca56be36858e292bce63b46c398ba3326f49ec1a9f4052cf2a862f1e9a7c63c2773015d2f1b9211afac40de65dd19a8c588548b78fe41180d2f425d592914401c06fa6808b851298df5b57fc9ca30a28aa17d0aa0f1c0234ab662b47bdf979f3e5320057722c0f17b3a8a7a16b5c51b0d3b47bab0d307136d72fdcd5af9eb3139df626d938f8189665fe5f6603242d5e3e148440041805e8fd16952062edd6cc2381861535f01366f9f95645a72f08d44b981ab3748e4c70cff9cc886bd1c31f8e4d335cf32d2525e6b58fdc4dd300fc50f6150680d923c3749db60798f3dec9eae54ed2fa872e184055480576ba72b69a0001b26f2026d009028fc8a65489d2614c006f9c771f250d61747f943e6312aac833a212f4db35da8e2915a01fc9e180f2ffcfaf1104e80422f4c05b001d9d0058a9e4af432427f24dbeb887c14ab6aac9fbe0efd90c632dfe5e69e82c377486b8dfb652c5e15c7e642755075fbb1e981926913c5a120868da64457f345276035196850a82dec9ca32d57eb427eca8e94124ac282219041c5b841741d4d51cbcffd1474d51d0d1459dc699fe5e4bba083586fd7acf14a2fb0918666f22576bdd3a2e154ac8e046a8f097e97287318c4f6caee844170330c6e2f9eca4176e2c5a680a127c0e96eff4c599835f3d2bf367a0b875453d27c7d442c8872f4cac48943b3b6cb06e9481cbde4ac8f5da007c611b821fc3ed16ccdde06d800a1602dd38c32d8adaa2736b30afae8402932d068967e377420215c1a4e0e6007f07170fa6d3aaa85e722ddbc70b693de2a7cf569529acd9811914e8f97ae1e643e0d152cb8555f29206514d3240a00c6446d0ebd9606c91e8da058c90943d447beaf2e372f8dd42aa212408de6066028383d97a43e833fc67aa2428774ba5c7c2a66e15668dca46b4fbce1080f28f66e5c50172a237690f2ae51c94254a5942979a0991eef285771dd3be23640b0ea0e2f3de7413c4a645c23728b9244fdb11986ca55feb971713a5678fd84f4a5d8b51e1b4f030194a2b51be29e17da8b7cb3fe5cb7efbc048fd8dae5139a589705f8fc870893fe424128f49101f5c054fdb58c88b3fee241b78253da8112438213269ccadcad63e9aa7223d1ea174f844d72fb3d5db91c4b8714e4d59696d0bf1ef2b2ae5bae4537968c3cc1569afcf44dc272d3d32f0733184c41218b942d710fae2434a3a56b0d508162c2a2a917588da4aae78962c9cf90bc932fd7bc992b3c52258004c7caefffe77d528d616417754628a72b30e0f45c7e65949f3395c806964eca1dbc423f3b65ffe20d4ee7efbb6f447d51600bd67905d2d299d395b52aedd88ed711816c0333d811b41471c5cfe295a1a4a4db3de75ec292924778bf424e9218259a6b7f94ca4de1d64856114251e486d053c62991f9f188460173362762f9900ce3e1a5ada386502b0e5b56f9404ef2c63e916fb8f5a627f9a880f7a159980f16f03963d4a7cc22a96034d1715ebbf20508dce2c3628f7addc91a88e217fa55f7a9b9a0aafc2f7119e43352565626bd5bc5cb107a786414a67a8b4b4e0e4be80bf8a4a2035ce7827fab1230661e770ac02e270a550ef0b85ccf32894e0b0e75ba7bc55a3fbbbfb27334b8106dd51e5d6d8486aebf5ea816355b20edcaa02e36380c9139ab84cff2e9ec455486ed921be7a707182dc8c15b4cb5139be6fc91772a524d3d4362f1a10c54c859286dd606b08d02d86026c35e26b142db3fb1d0fd81676905181fbe513cf33391ca2f39e2c65d668b95c49b718293493474bdbc3cb86a31c0f46748a15218b874cb09c53533c69d413ee6292b77589c7fcc95e9ea5ce7d7ab5777d310117586a6e8ef066038008645974b7d47fafaa565a6d659a06d06c7c15225ebd2207326445578b3c2bf00f661bfed62d3753e0b5a82cf7af39558adb6805540b0902255b0e0863492d0bc8fc12971ed4d2fcfb027a2e0b6045a3a22fe2162b341157ac726aa04cc3aa78cee25737ce846d8cef294ed66ce2304a6c873d91d7401ea1bad5c989f125202be3679209a781a5f402a11a307ba9be74e3e0e9b8c6492483e5830dbaf9e7c75369c1f5f1ff9ea04ced09671a4f90968e6edcbd4fe18b0d563bf110bdbba3022c780066be826e4a16b6b58ae026c446ffcc951012a53e0c6c30d9dec59170fb768f560ddecb81cd11ee40d5b32130eaef968a90b140e7049b1f831acea8a1cd188ac32dd8097d8d18b77c0053e35e98de2f7cd7a293c500627eeb6d8b21f48a30c57effc018ccffeec4a791560c904000481138f93e712e42086d0e3ab42bd26e7a1db2844d10038dcf3e657ef2c7911e741d28d5324b15ad13a0d28f77179afd9054e92bec7a63f59df53f4d1c331d77cd60ef93eea521340bd32b5815ae45e7b87a8a9b16f4e9de17b4aff3565b2eb08ba51700b86a0f973038d457649f4893d0463019c051cb09064c547048d5fd442719a802456a08cf091886f4788d830504918cd8540dba231410e6329949516be60e1a0052f31ee0ffb56507bede694c38b9c0d01e159ac2d0136ed72d3c76444fda9fca03dd205c91c5784324ee167c31b8c093f74380307a76fc82292fa7eb5590e7b7022a22a9eb3ed610298d7589d3244d678c1467274b4b7693f34528687a4f07723a88250a731182dde4b9078f19edb07a91b46d07e9f5b6e1d74a28eee766e7c24792241824f65f0cb9f011e6bb647c587dfcdb27658765a2c6e45de8f4a3ad57ec180e4738704942e9f476d28946b3f418415fd20f63884063876ded35881a02ce801461898f0fe606523a6b7883b20bd8d611d0fe681edef5115884c6c334efc604145bb81c2bfd9164cd472b425271ce458bfa8308cf2d88047470d077600ffebd28841685b555bf046f47ddd88eb9dd376f822028ad0124d7ce05709acbaed2a02c9e94b99d331e6364c730e717fad6a1dc20ec39811400565f7edabc4c969f5700f7d811a9280beaea307de5790775f4fe2e67a2314fe1e72b100ff0387c24272b6373a94d8419fa5c063a878100e88d1721c2d6d50851481c76dea7a63d0788231c85ea19c013f5c03d4a677271312faa739b4873663a497778647a32679e0e21f7f054b9ce85a30d7aa8d1dbce4ff771641db0040b5da73afcbebd95d7ef0f20f5c908c87176852deeaaa63391ab9769c3332d52e8fa4d83877d1cca02c13b108ad1e9d76536a46407a712491e3457e8762431aa069a1fe3196f50985354e9169e62e760200ca8701e08e8cff5c202d953c56145030d40d5f9943bd94573050e0a52e52d336c8919428eeef6fd319a88615aa774a9fa73c011381822ebd6631c2a4c209d63095d5a87b9549024cd89f20f954a7d2c69c3fdeb5ce6fd0109962c5a5f8fa65574d7814c52fb521045ababb5f9ff068dbf53c555e268017119e616ba0b330bc00e33dd5595bbcec78ad38750b6851dafa109dd984c8b819c98ef1fedffa2428f81e7d5d1d8f885d4e16f9842febb7b2f0e5e4a6bc66c9ecb2dc3159d6487ccee645f722f086e57ff8e5a8e39e35485b86b53c7238079e93c0bbe2f07f0ea511b66e81830c1605a7078bcb2d52a6b8b5dd797b93f789ed16c73f92b8f33bd7ec862b4ba23e8fc202e2744eb568abe3cffba8e115ba9311170c2311b0199182f529c2c65c00c6826db020328a91bb3126c7bdad1a492a0d74173eb1234c9b68b397e60d7d3758b63851aa88e78107d227f4e273f63b1a1af68953d28f6d2be11be6f48cd58a144479cb1ba3bde744dc37971577dda2f8ce45651c40d6045f19eb7c7b669dcfcadbd5ae8d5a0d493f5bbcaed7183110de4f1dd9c8810ac9ad46860a8295c4292ccd490134361d855829c51a3a2797f53a37e2f076d10a77a0bcc0876b3dfd931f27a2b7f0047dc8b22ae49564a315dd55858b560340b7887df785116778f46c8bc1f1e31a31b5b271c8b92b15dbf56b43dda945b8e16d4356f08d7f246e74a2fa46edfcd29458e40c552dc8e5f6a93a05d1cf51e5f129e70d86833a9876acd0742d359a85234857f49678aaa7db31697026bf5c44b1dbb291d92025f1785aa099c1b82c96d9328702bac1c2c241c2c122cdccd5f4f04a989a58b0f04bb0e29a8f6d17e1b6c7af97c437a721ad9f3ad4c47e0648eca16159051364b2816611a84e0a8f5b75cd70afb6c9284958127ce0b259be8aa291aa7f290e8f3f4418192dbad3dec17a5bd968d6cffeb3f22c527f4e90ae30f7d28a7c1a6110b539db9387a990827185c5961dfe84756ffb40ea96f62f0bc16fc2c4cbc0a156501acf3092e49c9f60fad0543888eadc5b89f9449e949ad902bdb08f5a4976e10d2a8c7efa88a5b06fe297525b0df3fabc95f52e3b18062659feb16be786d31b5556ee2820c0d8b1378d697c9595d1167b57dcc2026995251640a2b5d77699485625ed7fd9e4b8f8ec6180017dc9b3d410799d9528fa443e69f3d07cd16525e9d66fd98cba9c5e9e01aa70c06a8ecb4e0f84ca198c947770fb931290af31ebc3f3cff38a9fb9a15fb629aafa6963b51b5895e0399ad8111548bfe1ad7d46c4642b72d716b4158dfe6fedb5a479c3d6c9e6f70d8543502d1b762651cd61c3f19bd8eab5bea99395ce0dc62b2641803657f04a71aadb26f7397ace71ac7f76c2b9d23df3e6ea1aa879d62368ccc857d3ac7aa0c08e77fee15cf6dbe238dbd13734da2faba278c1a5644de4c187240a5a93a35d94d561ea325aced1829961193464de95f81cafa44b72979fd23147dbb15c1330695fcb250fc080d7c0d883414e6447434cd9d686a8677e75107032833d596408e7405f0529c8b6773110f060673302f6f2ee86b7cf932a4d8604731b7799d8bc57af42b882202bd77184959485e4b1305dea17c2591d83aeded94ed191077bd87411c76dea0c53ead1e149921c4d794a0bd496b964f632b7480d98168cb324976d8176f1bf465182710f0e7280e5264ee56dbd5372c80262d6ddaa89a14947169f08cfa297144c02a2860329ff4329710e7688b4f4e3becc5a92a3b58e6964909d575b0acb912bb5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280ee1ed81bb086681bfd6b3d05aaad7d9f38cef737aad652dc791c050f4de70256f4c038d83f4be92ff9c5d2913c14f4da0ec56b70ebb8a31a31e1a1752753114b24a6dc3a4e464c75d069fab03805cf1a372922365f109f47ee145b88be75d1a68efc4e55e3259111610fe29335040f2b4b447ca9b464734c7e0cb475e38021787a2d5d75d80d797f9cfb2bbe6db90b04ee343695739f139f6dc5204d9ff701c441263b551e6e50cbbec01612054ce346e5c551751a969f065be10a57a7a162c008892dedb455349e0fc18c8a18c4d34eb7deafbf075aaa7370175cd9a8f5701aa603fd996648b467626a3c776133d7e42a188a081cb237dd6b16fdfb4cb1525c49f9e21c720ea6de3c4192f14da4ef8d11be588bc825939ebd5eae7e04f831a3479262efdef3b9cc0b09fb1440233f2b1c9516ee4457002c4b27aeb2d5dcb0ca1c14bad011ca367162a3335c2d6dfc5de5aa7860d57ca1065dd3d0f68bb4521ea931f1550e4643146c796c2be8860fb8603d3913826329136b970dbd7884f273a3c4c81ae08e5708e8694f82a218b844f75ecdd350d4b96d531283d6e4e9b067a0621f6400228d80984a50ac7e76eee348a668f9fc103f0c8f19cd4db47150a3b633fecf24ec49ed8b64308cca6cfbc7ee460388fea5795218f833cecb3be2cae76914727e808ed7f3db62d1ac8d5456a1490ad5e8253e001fc03f51e6f1427e988cc59e4385d88706bbe66e43451a1ab115a66c3354d4c724d5d9a171d64197c583c8197b9512dd858c95a57eb916bd9732e5168071877b6c1cdc81a39aa29f9b72c26d7002bd80ece8da70f17c4f217df0ffb7ff640aaeec9154790818e223e4d96ee3647abaa3220004bb20aaa6a2608f88381bd62567abb9a0a7bdd760ce8e1f30faf561eeaf478876faecd165aebce9a1e43b357e11cf964c410e88c026d443bc77f8c390b3bd5478b186760f4f9e961bc31bf12d6a246d035995bfd255a9a35948144a629824bd8f906f487a7a4274dac2911fb3c1243046b645e380f01b4a4c4442d72a7eb9939f1b6a80bbc671a5ef53060745667a02dc6fc1d5412a2e2578ddd2c8d1b704c4bc7cd4859e0186d28c89f2d01d636be5eb6eb2a1d1f735c655ce7a0cfcafd73470e8a4e4f799e58633f742d29736a3b51ccf7e6c3229492de5af128da76d71b24f49614f6633e7268468f040bdf89c23a9d37b0332e7a4e9078f9ab8c242790f695e67ed3a924b0bc1e88de0bffd730be1ead62b323506e057e0655afbfbfbdcdad5ec081f1aef9df00b84ca0e4859404d5888a342e938da295228784f9c0cb0189e45dcb09a5f02c4ff1ce1d2c28b4fa5673d1b718a5a5d8c10c64154af3adc7ea8475573dc824442e4c01d17f87b1f404f1217d1e398f7699ed031999bd9ac3f0d7ff4b6713a4074675eeb9d25f82bbc00290cc24d0be53547e3c02a2618aee442a7820708affde71828f3805fd1fd4cc29edc91be44973bd3ad7da00d832b226a77da938be15cb6cd32ba82f171d28868effcb115fa7473be590f074ddfe2ebc8488b59a18bb38525867655de2997ee24825ae115fa7473be590f074ddfe2ebc8488b59a18bb38525867655de2997ee24825ae037bfb91b64e85be0d4a8667691caa0c6358aea239c54903b32a118b2e7b497c2f9d9546a2f04387dd35c3a71433f7292b74fba2c995c0c9d640f54c1ab8de4c26f04e78b89470d855c20dcdfca3d2671cea6d933854dcfa4192b14da4ce66fb02892c599c828c32236f20d695c4e9359f6084ce8ffdfb2d069d1db01609ca7910ce6b0b5de4ab4c3c8543e057dabdd37c7b667d24612392520eb1c899852a370000000000000000000000000000009797d795d737e1b979fa7a43050009b31d00000000000000000000000000000000001ca45d8dc31e282170a7ff129cfa38000000000000000000000000000000d7c674b2b2d3de21864b4c06b445638f65000000000000000000000000000000000000576d8bcbe660b735d5685923af05000000000000000000000000000000cac1c3492df7c30476866dff9abff19bee000000000000000000000000000000000025f192b43b5382ac4af3be538051cf000000000000000000000000000000df4a9530a925d00f22065fe7cad753975b0000000000000000000000000000000000108f0cf969498bcba32a70dbad1687000000000000000000000000000000ba9053252b0312b8904d8b8d774569b9e9000000000000000000000000000000000028b710e0d16fe791870760109671ef00000000000000000000000000000016d223c350867a162b05863c5ce88a3b49000000000000000000000000000000000013730766797d15518c6a569d3d497f000000000000000000000000000000b208befd39295279a943571097bd283067000000000000000000000000000000000017ce11d5d1ba62d0ef83b628acbe0e0000000000000000000000000000004bf86d932364b78bba73ec1d9b87e820fe000000000000000000000000000000000028d95da079a9551e799531df75dace00000000000000000000000000000057237be80764cc67d948e4949a92f14224000000000000000000000000000000000023e7533a837dc268ad2ed16ac9c62c0000000000000000000000000000004937bca3b245a0a22ce7ecb07e6fdf903d00000000000000000000000000000000002cf9ba56b8cfc50346665d6de5d18c000000000000000000000000000000e1b78d04dfb25fc01685cc738481b3badc00000000000000000000000000000000002eba188c362a57b685af1e9b3bda3000000000000000000000000000000007c662d2e06b54895c26ec3a986e196bec00000000000000000000000000000000000fdff6f4c9ccd7e8317dcdabbbebec0000000000000000000000000000006c79fd69875f8b3985e82f0e46d3673700000000000000000000000000000000000023dac647c5d94412726169aa238d160000000000000000000000000000001150271e6f97abd310d9335866f3fda97200000000000000000000000000000000002767fd842bfa3de40d0eda53c0a05f000000000000000000000000000000cbdce106f37620e9078fe16bb7b02601f0000000000000000000000000000000000010bd6c41c2dd2284d4b9b6e4d15a9e0000000000000000000000000000000be81908bcec408dc12d96b84378818f9300000000000000000000000000000000000c9f70f3fdc454b34e79ab53a97e4e000000000000000000000000000000700932a1611d56e1b5154f1fc6184a0a970000000000000000000000000000000000115747257cc2d072f0e7d2e7948fe7000000000000000000000000000000e25d81aba5b319c760b9d57b55e72b0ae5000000000000000000000000000000000022c0f3f3b5f1fea28a71bedd6b3f330000000000000000000000000000004b2b5e08c054d69267bf1556f90982f4c800000000000000000000000000000000000e5eb820cca35817d5b4047ed7a73200000000000000000000000000000011b47ae66a939174aeeb482f9583559df3000000000000000000000000000000000027d06e5974431655024a888b050a6a000000000000000000000000000000b5ba537d4202f3173d52489b187bfb3d7c00000000000000000000000000000000002f857079bd8047f160b944257cb7e0000000000000000000000000000000afabc8c0eeb4a78875260f31e391f633330000000000000000000000000000000000152006877d1422b7420a17d4ce457700000000000000000000000000000028ea740ec1c9a726843f663e0bf350d24a0000000000000000000000000000000000072cf13ba32cd4a0a0fd273c6b9375000000000000000000000000000000865b25d0ea6cf9f0233928126bf1b5823b000000000000000000000000000000000025d20f116846920dbcf27055d0dcad0000000000000000000000000000000f166e8394fb6d3f9f642648bc9c31ebf2000000000000000000000000000000000018ee2d57fe0336884a6414a2c8e80b0000000000000000000000000000001118d36d371f0449b94bb3f8d99433cf1a00000000000000000000000000000000001b5196879f44dba378b49203e906b50000000000000000000000000000002e82ad235ee373a6d7b1f2eded50aa830700000000000000000000000000000000002d8f608f889838d37e2b8dcf03a0340000000000000000000000000000006d39ce295bc672031d7d47910a67992de000000000000000000000000000000000002e10b05b51621243b09749e80245ec000000000000000000000000000000dc3925f179a1d1a2184c1491f1bc6ab69900000000000000000000000000000000000874863a2a3dea38d871b30861b33800000000000000000000000000000011da445bca6ac1283e453130e49c7d94050000000000000000000000000000000000013b89ed1963fb3e818431581dd0ba000000000000000000000000000000e96076eed95aef3915d727c2f21789f58600000000000000000000000000000000001f29182c48a9bbc7de063c10ce78cb000000000000000000000000000000a0b8f3c94562b6172b6bb223685cc28b60000000000000000000000000000000000023e4ad64cecff1e35ff094bc4da27e00000000000000000000000000000008998a12dbca0980e4fcb4e7ed59604517000000000000000000000000000000000020e7986b184d1585842b647be37f32000000000000000000000000000000ba796c8ffa0aa02e107fbb0e36ab7a646800000000000000000000000000000000001ccdbaffee52b92561ad85b08187c80000000000000000000000000000005e041d6983b7b0c5a70dc4d91cc892880800000000000000000000000000000000002bfb62f0973a3b8c65ea0fbeae8aff000000000000000000000000000000499ab5e2c5366cf37720e9e2b8c9f76ad5000000000000000000000000000000000014398184b7a697b3df2e045fe085fb000000000000000000000000000000faa4d35f206a480d28a770359a61f78b290000000000000000000000000000000000224e7db8d4f51e4064ae37cbb73c1a000000000000000000000000000000d947f4c84c12eeff42b721c4502c71fd7400000000000000000000000000000000000cd2156883143792630b7f4ddaae480000000000000000000000000000004bfc87b20ebea44f577b89c9e21e7fe81000000000000000000000000000000000000f65f2c8d300a7148d5370262489e30000000000000000000000000000000cce5c0cf8db67dcd2a2e2dc0abcec757500000000000000000000000000000000002d93bcede83289cd936e71b78a72a90000000000000000000000000000003a5319acad7f830650cacfb371166dc35000000000000000000000000000000000000c4c1603440e014c7c2e933881ce7d0000000000000000000000000000002c486dd9eec991dc7fcfc84a690a8e491a00000000000000000000000000000000000edf3cb47a9c7598b1b85eaa4faed200000000000000000000000000000023c22a70d328d3c8de8664f9b99dc0ed9c000000000000000000000000000000000014c86cd45594ee1137dd2e52c987c40000000000000000000000000000006ade4536e640f7da003e5d2b8fd9adc8d0000000000000000000000000000000000001f95628792bb98dbbf4c975c2f8b5000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000c13cd18f81a6b854ee31cf4698fea0037a240ab14ecbef32a7447ac4b9be2e81e7de67b9144863764287b1e103ac55f730a3e52dc8a2259e8ce97c1c3fdd09315c301f1db3129290e301cc4e1a1aeee544b660bfa97cd40afed5cefb29724b30ebd9428f3b4e0be1c1738329f3c37dd123b501715a9a9c2f879cc92f73f254103a6030897246c85ca74a1358acd860bdad96aa842b6b8697aa796fca75ba9c32cfc61456243dc92be938206138e906af3a4dde425170f9b6202e8d9dcac68c21dde5c5cec5dea6e203eaf82cb25082fa9f50bda576d6b131f5e3b52a24b2cae0ba507ffc9aed31cfd31b4278d12640ba2abaa8e0a7c05830cde6d7fc45829741cf1f02e22857ce948b261147281752c76e5192bd6b05d0d16188e572129ca04266137fc87cfca4eddc952f0334fba452f1fd11bfd0fee0ea69fd5d3e42d25982fa50c862f854ed01d3920e0e40051d6e6060cd69f4a77ef27abf1260da3476802855df5f2888e181715f3ea04d4c1e727681188bfd3f3ce03074dc7981dc44a1c11c591d5e0035d82674146de1719b4406290dde5ae22f4682979ac3f632ac10177b5134d027e66c5fbc42959c045f8e1f7a299a333baa6954fc2a3ec86a65f0d4b49d3196aa8d0bb4a89e3696e69a6e2b521cf04d0c82d05be753e4659744c1d913f3c9877bb95c073e65a80219d02a795319d0a9c2af1b553510b868c20ff148d036f9bbdc7d0c10bfa72af5e0752e54cbd8a088663b20fef1dabf64bdc9b1a75d27b47fb8a9451fd4f838dba418dcff0bddf6c484ef9f6d5de3f11b5aff714eb05e2187d6b0d1b72725b0f3b4ecc9d8f0a30a54cc31c864d391bba52440f0da20f41819d926ffe689075952fbed85af22b9cc4a7767bcb627bdeb4f5f2c609c49b9526b35ec01c9735b90e278e494e016a72358eef310f1bb5b578ee90962c3a261e25db3b47ca5d523ff0c3a116de3eec30d38e0bb16de9773b78f9731524066d2b90921923908d99867ca3d8242ba52c96266d60766bac598c9978099c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaaa678b2d379a2c8990d7185defd5d981000000000000000000000000000000000014f1c6e34eeac341e8e572aa7ac11d00000000000000000000000000000058127b98db32dc92826b750db562ebd50e00000000000000000000000000000000000b02d4901098fc735e01c6ac6c640b0000000000000000000000000000009611276496a6c037459063ba8ca2e46bf500000000000000000000000000000000000317696b269028c32f3440a0d13caa00000000000000000000000000000044ed17fb37a83d24f6ff1fc96522f89c8200000000000000000000000000000000002150f0f9f22c07e1432ab413e25b4b \ No newline at end of file diff --git a/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_public_inputs.json b/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_public_inputs.json index e666dc110b3c..451247523069 100644 --- a/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_public_inputs.json +++ b/l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_public_inputs.json @@ -1,19 +1,14 @@ { "inputs": [ - "0x07eb76cc780e3a054342917c91fd2717cefef6e8994286c6414e2cfe0b470f6a", - "0x27c36e90dafc5d889cf2e92c2f46009b4c61203f316da84d5fe173845b9dc72a", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x034608472e44e3d796a30320dea6693df95c42294c3a119fda9f3c2d39053ae9", + "0x0e74ef920d724a7a23120f66991b1cbed34c207b593df6e421113b7c287283ac", + "0x0000000000000000000000000000000000000000000000000000000068c027a3", "0x008d535e2a7f4ee38a4d12aa88bcf21d2c2f6fa051d12eafba6655bf37e8c11c", "0x00f54fbb0f658e7013ec2114ef095a29bb3e2f95b96dbd93e46f12f67863111a", - "0x00727b8cb376e4e4ac36880437f277de0c33748a1f505725160a94be705917d0", - "0x00ac375d5fafd70528bdebe251b9be49a9ac1428c5cb794e8b01e740df5760d1", + "0x00ed45ee6335b3285f58a3c472e398fc6754d1eaa9d7043a60b2daa0a67332e7", + "0x000105354ff92c66a5d42a8d34033ace18d259e4dc04b35a584dc370c00586ba", + "0x0037e4a54fb3f1500058797f475d37f2f8cd9b87f20762c21497a2ab2f655f64", + "0x004e3c2357bff38ea9c5d68fc06b8279435cdba99ee27fa272f0fe6091ca08f4", "0x0a70167613fa7c456b46f57e91d4fc40c1a7895f55bb7d36ef0ac17ff05045e6" ] -} +} \ No newline at end of file diff --git a/yarn-project/ethereum/src/zkPassportVerifierAddress.ts b/yarn-project/ethereum/src/zkPassportVerifierAddress.ts index c8447b2f5f1a..56e059f7c708 100644 --- a/yarn-project/ethereum/src/zkPassportVerifierAddress.ts +++ b/yarn-project/ethereum/src/zkPassportVerifierAddress.ts @@ -4,7 +4,7 @@ import { EthAddress } from '@aztec/foundation/eth-address'; * The address of the zk passport verifier on sepolia * get address from: ROOT/l1-contracts/lib/circuits/src/solidity/deployments/deployment-11155111.json */ -export const ZK_PASSPORT_VERIFIER_ADDRESS = EthAddress.fromString('0x62e33cC35e29130e135341586e8Cf9C2BAbFB3eE'); +export const ZK_PASSPORT_VERIFIER_ADDRESS = EthAddress.fromString('0xBec82dec0747C9170D760D5aba9cc44929B17C05'); /** * The default domain of the zk passport site */ diff --git a/yarn-project/stdlib/src/zkpassport/index.ts b/yarn-project/stdlib/src/zkpassport/index.ts index 39e7187095aa..18530a1e9ee3 100644 --- a/yarn-project/stdlib/src/zkpassport/index.ts +++ b/yarn-project/stdlib/src/zkpassport/index.ts @@ -10,7 +10,7 @@ export type ViemZkPassportProofParams = { publicInputs: `0x${string}`[]; committedInputs: `0x${string}`; committedInputCounts: bigint[]; - validityPeriodInDays: bigint; + validityPeriodInSeconds: bigint; domain: string; scope: string; devMode: boolean; @@ -26,7 +26,7 @@ export class ZkPassportProofParams { public publicInputs: Fr[], public committedInputs: Buffer, public committedInputCounts: bigint[], - public validityPeriodInDays: bigint, + public validityPeriodInSeconds: bigint, public domain: string, public scope: string, ) {} @@ -43,7 +43,7 @@ export class ZkPassportProofParams { this.committedInputs, this.committedInputCounts.length, this.committedInputCounts, - this.validityPeriodInDays, + this.validityPeriodInSeconds, this.domain, this.scope, ]); @@ -64,7 +64,7 @@ export class ZkPassportProofParams { publicInputs, committedInputs, committedInputCounts, - BigInt(100), + BigInt(100 * 60 * 60 * 24), 'sequencer.alpha-testnet.aztec.network', 'personhood', ); @@ -93,7 +93,7 @@ export class ZkPassportProofParams { params.publicInputs.map(input => Fr.fromString(input)), Buffer.from(withoutHexPrefix(params.committedInputs), 'hex'), params.committedInputCounts, - params.validityPeriodInDays, + params.validityPeriodInSeconds, params.domain, params.scope, ); @@ -107,7 +107,7 @@ export class ZkPassportProofParams { publicInputs: this.publicInputs.map(input => input.toString()), committedInputs: `0x${this.committedInputs.toString('hex')}`, committedInputCounts: this.committedInputCounts, - validityPeriodInDays: this.validityPeriodInDays, + validityPeriodInSeconds: this.validityPeriodInSeconds, domain: this.domain, scope: this.scope, };